[SWEA] 5099 - 피자 굽기

ttaho·2022년 11월 7일

SWEA

목록 보기
5/38

문제

N개의 피자를 동시에 구울 수 있는 화덕이 있다. 피자는 치즈가 모두 녹으면 화덕에서 꺼내며, 치즈의 양은 피자마다 다르다.

1번부터 M번까지 M개의 피자를 순서대로 화덕에 넣을 때, 치즈의 양에 따라 녹는 시간이 다르기 때문에 꺼내지는 순서는 바뀔 수 있다.

주어진 조건에 따라 피자를 구울 때, 화덕에 가장 마지막까지 남아있는 피자 번호를 알아내는 프로그램을 작성하시오.

  • 피자는 1번위치에서 넣거나 뺄 수 있다.
  • 화덕 내부의 피자받침은 천천히 회전해서 1번에서 잠시 꺼내 치즈를 확인하고 다시 같은 자리에 넣을 수 있다.
  • M개의 피자에 처음 뿌려진 치즈의 양이 주어지고, 화덕을 한 바퀴 돌 때 녹지않은 치즈의 양은 반으로 줄어든다. 이전 치즈의 양을 C라고 하면 다시 꺼냈을 때 C//2로 줄어든다.
  • 치즈가 모두 녹아 0이 되면 화덕에서 꺼내고, 바로 그 자리에 남은 피자를 순서대로 넣는다.

[입력]

첫 줄에 테스트 케이스 개수 T가 주어진다. 1<=T<=50

다음 줄부터 테스트 케이스의 첫 줄에 화덕의 크기 N과 피자 개수 M이 주어지고, 다음 줄에 M개의 피자에 뿌려진 치즈의 양을 나타내는 Ci가 주어진다.

3<=N<=20, N<=M<=100, 1<=Ci<=20

[출력]

각 줄마다 "#T" (T는 테스트 케이스 번호)를 출력한 뒤, 번호를 출력한다.

풀이

[피자번호, 치즈양]와 같이 리스트 형태로 화덕의 크기 N만큼 집어넣고 화덕에 남은 피자의수가 1이 될때 반복문을 멈춘다.
현재 입구 즉 bake리스트의 첫번째 피자의 치즈양을 기준으로
1. 치즈양이 0이면 그 피자를 꺼내고 화덕에 넣지 않은 피자들 중 순서대로 하나 넣어준다.(화덕에 넣지 않은 피자가 없으면 피자 넣는건 생략한다)
2. 치즈양이 0이 아니면 치즈양을 반으로 줄여준 후 다시 화덕에 넣는다(회전을 다시 시킨다)
화덕에 남은 피자가 1개면 그 피자의 피자번호를 출력한다.

코드

T = int(input())
for test_case in range(1,T+1):
    N,M = map(int, input().split())
    cheese = list(map(int,input().split()))
    pizza_cheese=[]
    for i in range(M): #피자번호와 치즈양 할당
        pizza_cheese.append([i+1,cheese[i]])
    bake = pizza_cheese[:N] #화덕에 처음 넣기
    remain_pizza=pizza_cheese[N:] #처음 화덕에 넣고 남은피자
    while len(bake) > 1: #화덕에 남은 피자갯수가 1이면 반복문을 멈춘다.
        if bake[0][1] == 0: #현재 입구에 있는 피자 치즈가 다 녹았으면
                bake.pop(0) #치즈 다녹은 피자 꺼내기
                if len(remain_pizza)!=0: #굽지않은 피자가 있으면
                    temp = remain_pizza.pop(0)
                    bake.append([temp[0],temp[1]//2]) #피자하나 치즈//2 하면서 추가
        else: #입구피자의 치즈가 안녹았으면 치즈양//2 한 후 젤 뒤에 추가
            temp = bake.pop(0)
            bake.append([temp[0],temp[1]//2])
    print(f'#{test_case} {bake[0][0]}')
profile
SW Engineer

0개의 댓글