스터디/코딩테스트

SWEA 5099 - 피자 굽기

공대생철이 2024. 1. 13. 18:16
728x90

 

처음 든 생각

- 전체 피자를 관리하는 큐와 화덕의 큐 두 개를 생성해야겠다

- 화덕 큐에 피자가 없어질 때까지 반복문을 돌고 popleft, append를 조건에 따라 처리해주면 되겠다.

 

나의 답

T = int(input())
from collections import deque
for test_case in range(1, T + 1):
    N,M = map(int, input().split())
    every = list(map(int, input().split()))
    for i in range(len(every)):
        every[i] = [i+1, every[i]]
    q_pizza = deque(every)
    q_fire = deque([q_pizza.popleft()])
    result = []
    while q_fire:
        if len(q_pizza) == 0:
            temp = q_fire.popleft()
            if temp[1] // 2 == 0:
                result.append(temp)
            else:
                temp[1] = temp[1] // 2
                q_fire.append(temp)
        elif len(q_fire)<N:
            q_fire.append(q_pizza.popleft())
        else:
            temp = q_fire.popleft()
            if temp[1] // 2 == 0:
                result.append(temp)
                q_fire.append(q_pizza.popleft())
            else:
                temp[1] = temp[1] // 2
                q_fire.append(temp)
    print(f"#{test_case} {result[-1][0]}")

 

먼저 전체는 [인덱스, 치즈의 양] 이렇게 다루기로 했다. 그래야 나중에 결과 도출할 때 몇번째 피자인지 바로 알 수 있기 때문이다. 

 

전체 피자를 담은 q_pizza 큐와 화덕에 있는 피자를 담은 q_fire 큐를 선언해준다. q_fire에는 디폴트로 첫번째 피자를 넣어주었다.

결과에는 순서대로 치즈가 다 녹은 피자들을 넣어줄 것이다.

 

이제 반복문을 돈다.

만약 q_pizza에 남아있는게 없다면 이미 모든 피자가 완성되었거나 화덕에서 조리 중이기에 남은 애들끼리만 연산을 해주면 된다.

그래서 popleft하고 치즈가 다 녹았으면 결과에 넣고 아니면 남은 치즈 양만 계산해주고 다시 후순위로 append 해준다.

 

만약 q_pizza가 남았는데 화덕에 아직 여유 공간이 있다면 화덕에 새로운 피자를 넣어준다.

 

화덕이 가득차있다면 하나씩 popleft를 하면서 다 녹았는지 확인한다. 만약 다 녹았다면 결과에 넣어주고 q_pizza에서 새로운 피자를 투입시킨다. 안 녹았다면 치즈 양만 계산해주고 다시 후순위로 append 해준다.

 


원형 큐인 것 같았지만 그냥 선형 큐 방식으로 처리해도 무방했다.

 

처음 풀 때 while문이 안 끝났었는데 q_pizza에 남은 게 없을 때 그 안에서만 순서대로 조리되는 것을 빼먹었다. 그거를 빼먹은 거 빼고는 나머지는 모두 연습장에 쓴 풀이과정을 구현했더니 올바르게 결과가 출력되었다. 상황 분류를 좀 더 디테일하게 하자.

728x90