본문 바로가기
Algorithm Problem Solving/SW Expert Academy

[Python] SWEA 5099 피자 굽기

by ʚ⇜❅🎕̈❄⇝ɞ 2021. 8. 8.
728x90
반응형

SW Expert Academy SWEA 5099 피자 굽기 문제는 N개의 피자를 동시에 구울 수 있는 화덕에 M개의 피자를 순서대로 화덕에 넣어 구울 때, 가장 마지막까지 남아있는 피자 번호를 구하는 문제이다. 큐 queue, 데크 deque 자료구조에 관한 문제로 난이도는 D3다.

 

출처: https://swexpertacademy.com/main/learn/course/subjectDetail.do?courseId=AVuPDN86AAXw5UW6&subjectId=AWOVIoJqqfYDFAWg 

 

SW Expert Academy 5099 피자 굽기 문제 정보

자료구조 분류

- queue 큐, deque 데크

난이도

- D3

 

피자 굽기 문제 요약

  • 1번부터 M번까지 M개의 피자를 N개의 피자를 동시에 구울 수 있는 화덕에 넣는다.  (3N≤20, NM≤100)
  • M개의 피자에 뿌려진 치즈의 양을 나타내는 Ci가 주어진다. (1Ci≤20)
  • 주어진 조건에 따라 피자를 구울 때, 화덕에 가장 마지막까지 남아있는 피자 번호를 찾아 출력한다.
    • 화덕 구조 - 출입구 ↔ 1 → 2 → 3 →...  N → 1
    • 피자는 1번 위치에서 넣거나 뺄 수 있다.
    • 화덕 내부의 피자 받침은 천천히 회전해서 1번에서 잠시 꺼내 치즈를 확인하고 다시 같은 자리에 넣을 수 있다.
    • M개의 피자에 처음 뿌려진 치즈의 양이 주어지고, 화덕을 한 바퀴 돌 때 녹지 않은 치즈의 양은 반으로 줄어든다. 이전 치즈의 양을 C라고 하면 다시 꺼냈을 때 C//2로 줄어든다.
    • 치즈가 모두 녹아 0이 되면 화덕에서 꺼내고, 바로 그 자리에 남은 피자를 순서대로 넣는다.

 

문제 풀이 과정

  1. deque 자료구조를 사용하기 위해 import 한다.
  2. 피자 번호와 치즈 양 튜플 객체를 원소로 갖는 deque와 화덕 deque를 생성한다.
  3. 화덕에 피자를 최대로 넣는다.
  4. 화덕에 피자가 1개 남을 때까지 5~7번 과정을 반복한다.
  5. 오븐이 비어있고 피자가 남았으면 오븐에 피자를 넣는다.
  6. 1번 위치의 피자를 잠시 꺼내고
  7. 1번 위치의 피자 치즈가 다 안 녹았으면 다시 넣는다.
  8. 테스트 케이스 번호, 마지막으로 남은 피자 번호를 출력한다.

 

코드 및 설명
  • pizzas - (피자 번호, 치즈 양) 튜플 객체를 원소로 갖는 deque
  • oven - 화덕에 들어 있는 피자 정보 (피자 번호, 치즈 양) 
from collections import deque

for tc in range(int(input())):
    ovenSize, pizzaNum = map(int, input().split())
    pizzas = deque(enumerate(list(map(int, input().split())), 1))
    oven = deque()

    # 오븐에 피자 넣기
    for i in range(ovenSize):
        oven.append(pizzas.popleft())  # 피자 번호, 치즈

    # 피자가 1개 남을 때 까지
    while len(oven) > 1:

        # 오븐이 비어있고 피자가 남았으면 오븐에 넣기
        if len(oven) < ovenSize and pizzas:
            oven.append(pizzas.popleft())

        # 1번 위치의 피자 번호, 치즈 양
        pizzaNumber, cheese = oven.popleft()

        # 치즈가 다 녹았으면
        if not cheese // 2:
            continue
        # 치즈가 다 녹지 않았으면 다시 넣기
        else:
            oven.append((pizzaNumber, cheese // 2))

    print("#%d %d" % (tc + 1, oven.popleft()[0]))

피자 번호를 어떻게 알아내야 하나 고민했는데, 입력받을 때, enumerate()를 사용하여 데크에 함께 저장하면 된다.

 

SW Expert Academy SWEA 5099 피자 굽기 문제는 큐 queue, 데크 deque 활용 문제이며 파이썬으로 구현하였다. 난이도는 D3이다. 

728x90
반응형

댓글