ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준_1756_피자굽기 (python)
    Algorithm/백준_생각정리 2023. 5. 21. 15:22

    ● 접근법

    d와n의 최대 길이는 300,000이다. 이중 반복문을 쓸 경우 무조건 시간 초과가 발생한다. 그렇다면 여기서 반복 한 번 만에 이 문제를 해결해야 한다는 것을 알 수 있다. 

     

    ● 풀이법

    1. 피자는 자신보다 지름이 작은 오븐 밑으로는 내려 갈 수 없다. 즉, 오븐은 내림차순 정렬(진짜로 sort(reverse = True) 하라는 뜻이 아니다.) 현재 오븐 칸 보다 바로 밑에 있는 칸의 지름이 더 크다면 현재 오븐 칸의 지름으로 밑에 있는 칸의 지름을 바꿔도 된다는 뜻이다.

    2. 그 다음 피자를 집어넣을 때 위에서 집어넣으면 의미없는 반복들을 진행해야 하기 때문에 밑에서부터 넣어주면 반복 한번에 피자를 오븐에 넣을 수 있는 지에 대한 여부를 알 수 있게 된다.

     

    ● 코드

    d,n = map(int,input().split())
    data = list(map(int,input().split()))
    pizza = list(map(int,input().split()))
    oven = [data[0]]
    for i in range(1, len(data)):
        if data[i] > oven[i-1]:
            oven.append(oven[i-1])
        else:
            oven.append(data[i])
    
    pidx = 0
    i = d - 1
    while i >= 0:
        if pizza[pidx] <= oven[i]:
            pidx += 1
            if pidx == n:
                break
        i -= 1
    
    if pidx < n:
        print(0)
    else:
        print(i + 1)

     

    ● 회고록

     두 달 전에도 틀렸던 문제이다. 그 때에도 n과 d의 크기가 매우 컸기 때문에 for 문 한 번만에 가야 한다는 사실까지는 알았었다. 겱국 이번에도 답을 떠올리지 못 했고 oven의 크기를 조절했어야 했다는 것을 떠올리지 못 했다. 그리디 문제를 잘 푼다고 생각했지만 너무 단순하게 생각했던 것 같고 2004, 2005년 문제인데도 불구하고 최근 그리디 문제보다 신박했던 것 같다. 유연하게 대처하는 습관을 기르자! 

Designed by Tistory.