반응형
rolypolytoy
현's story
rolypolytoy
전체 방문자
오늘
어제
  • 분류 전체보기
    • 현's tory
      • 여행
      • 개인사업
      • 컨프런스
      • 채용지원
    • Vision AI | 3D Graphics
      • Vision AI
      • OpenGL
    • 프로그래밍 언어
      • C++
      • Python
    • Computer Science
      • 운영체제
    • 알고리즘
      • 백준
      • 프로그래머스
      • 개념정리
    • 유용한 링크
      • 개발

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • EffectiveC++
  • 백준문제풀이
  • 백준2302
  • 아키텍처패턴
  • 알고리즘
  • 백준1756
  • 백준알고리즘
  • 백준이분탐색
  • 백준17471
  • 백준2169
  • 프로그래머스실패율
  • 백준사회망서비스
  • iOS비동기
  • 상표특허출원
  • IOS
  • c++
  • openglvscode
  • 다이나믹프로그래밍
  • 디자인패턴
  • 백준2533
  • iOSMetal
  • 백준
  • PlantUML
  • 사회망서비스
  • 백준다이나믹
  • sync
  • 알고리즘구현
  • vscodeopengl
  • DFS조합
  • 백준13397

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
rolypolytoy

현's story

[백준 1756] 피자 굽기 C++
알고리즘/백준

[백준 1756] 피자 굽기 C++

2021. 3. 2. 22:48
반응형

www.acmicpc.net/problem/1756

 

1756번: 피자 굽기

월드피자 원주 지점에서 N개의 피자 반죽을 오븐에 넣고 구우려고 한다. 그런데, 월드피자에서 만드는 피자 반죽은 지름이 제각각이다. 그런가하면, 월드피자에서 사용하는 오븐의 모양도 몹시

www.acmicpc.net

 

피자 굽기는 오븐에 들어갈 피자 크기를 판단하여 오븐 안에 차곡차곡 넣고, 

오븐 크기에 따라, 들어갈 수 있는 피자 칸도 달라지게 됩니다.

 

예제 입력으로

5 6 4 3 6 2 3의 오븐 크기가 나오는데,

이부분을 좀 더 쉽게 생각하면,

5 5 4 3 3 2 2로 숫자를 바꿔서 생각할 수 있습니다.

 

피자 반죽 5가 5 6을 들어가던 5 5를 들어가던 들어갈 수 있는 크기는 정해져있습니다.

5 6 4에서 4부분을 통과하지 못하니까요. 

 

따라서, 계산하기 쉽게 5 5 4 3 3 2 2 로 변환하여 피자 순서대로 크기를 넣어서 걸리는 부분을 계산해주면 됩니다.

 

친구와 알고리즘 스터디 하면서 친구는 들어갈 수 있는 위치를 이분탐색을 통해 찾았는데,

 

저는 오븐의 맨 끝 쪽 2 2부분

에서 거꾸로 오븐을 탐색하면서 피자 위치를 하나씩 넣어보고 들어가면 cnt++해서 넣어주는 방식을 택했습니다.

이분 탐색을 이용하면 시간복잡도는 O(logN)이겠지만,

제가 사용한 거꾸로 탐색해도 O(N)으로 시간초과가 나지 않습니다.

 

#include <iostream>

using namespace std;

const int MAX = 300001;


int darr[MAX];
int narr[MAX];
int d, n;

int visit[MAX];

void solution(){
    cin >> d >> n;

    for (int i = 0; i < d; i++){
        cin >> darr[i];

        if (i != 0 && darr[i - 1] < darr[i]) darr[i] = darr[i-1];
    }

    for (int i = 0; i < n; i++){
        cin >> narr[i];
    }

    int cnt = 0;

    for (int i = d - 1; i >= 0; i--){

        if (narr[cnt] <= darr[i]){
            
            visit[cnt] = i + 1;
            cnt++;
        }

        if (cnt == n) break;   
    }   

    if (cnt == n) cout << visit[cnt - 1] << '\n';
    else cout << 0 << '\n';

}
int main(){
    
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    
    solution();

    return 0;
}

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'알고리즘 > 백준' 카테고리의 다른 글

[백준 13397] 구간 나누기 2 C++  (0) 2021.03.15
[백준 2302] 극장 좌석 C++  (0) 2021.01.26
[백준 2533] 사회망 서비스(SNS) C++  (0) 2021.01.26
[백준 17471] 게리맨더링 C++  (0) 2021.01.22
[백준 2169] 로봇 조종하기 C++  (0) 2021.01.22
    '알고리즘/백준' 카테고리의 다른 글
    • [백준 13397] 구간 나누기 2 C++
    • [백준 2302] 극장 좌석 C++
    • [백준 2533] 사회망 서비스(SNS) C++
    • [백준 17471] 게리맨더링 C++
    rolypolytoy
    rolypolytoy

    티스토리툴바