[파이썬] 백준 1756번 피자 굽기

작성:

백준 #1756 피자 굽기


# 제멋대로인 오븐에 피자 반죽을 넣는다

# 출력: 가장 마지막 피자 반죽의 깊이

# 이전에 들어간 피자보다 이번에 들어갈 피자가 작거나 같다면
    # 단순히 한 층 쌓는 격이다.
    # 1, 2, 3, 4 이런 식으로 쌓으면 불리함
# 어떤 피자보다 작은 오븐의 층을 구해서 쌓는다.
    # 300000, 299999, 299998 이런 식으로 쌓으면 불리함
# 두 방법을 혼용해본다.

# 1. 오븐 각각의 지름이 가장 먼저 나타나는 층을 저장한다.
# 2-1. 피자 반죽의 지름이 d라면 그보다 오븐 지름이 작은 층 중에
    # 가장 위에있는 층을 구해서 그 위에 쌓는다.
    # 구한 층이 현재 층보다 아래 있다면 단순히 한 층 쌓는다.
# 2-2. 피자 반죽이 이전 반죽보다 작거나 같으면 단순히 한 층 쌓는다.
# 3. 가장 마지막 피자 반죽의 깊이를 구한다.

def solution(D, N):
    oven = list(map(int, input().split()))
    where = dict()

    for i in range(len(oven)):
        if not where.get(oven[i]):
            where[oven[i]] = i+1
    
    pizza = list(map(int, input().split()))
    before = pizza[0]
    keys = sorted(list(where.keys()))
    idx = 0

    if before == 1: D -= 1
    else:
        floor = float('inf')
        for i in range(len(keys)):
            if keys[i] >= before: 
                idx = i
                break
            floor = min(floor, where.get(keys[i]))
        if floor != float('inf'): D = floor - 2
        else: D -= 1
    
    for i in range(1, len(pizza)):
        if D <= 0: 
            print(0)
            break
        if pizza[i] <= before:
            D -= 1
            continue
        floor = float('inf')
        for j in range(idx, len(keys)):
            if keys[j] >= pizza[i]:
                idx = j
                before = pizza[i]
                break
            floor = min(floor, where.get(keys[j]))
        if floor != float('inf') and floor <= D: D = floor - 2
        else: D -= 1
    else:
        print(D+1)

if __name__ == '__main__':
    solution(*map(int, input().split()))

댓글남기기