반응형
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 |