처음 든 생각
- 전체 피자를 관리하는 큐와 화덕의 큐 두 개를 생성해야겠다
- 화덕 큐에 피자가 없어질 때까지 반복문을 돌고 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에 남은 게 없을 때 그 안에서만 순서대로 조리되는 것을 빼먹었다. 그거를 빼먹은 거 빼고는 나머지는 모두 연습장에 쓴 풀이과정을 구현했더니 올바르게 결과가 출력되었다. 상황 분류를 좀 더 디테일하게 하자.
'스터디 > 코딩테스트' 카테고리의 다른 글
백준 2580 - 스도쿠 python (1) | 2024.01.15 |
---|---|
SWEA 5102 - 노드의 거리 (2) | 2024.01.13 |
SWEA 5105 - 미로의 거리 (0) | 2024.01.12 |
SWEA 4881 - 배열 최소 합 (2) | 2024.01.10 |
python 코딩테스트 - 프로그래머스 숫자의 표현 (0) | 2023.12.22 |