출처 : https://swexpertacademy.com/main/learn/course/lectureProblemViewer.do
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
1. 문제 설명
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는 테스트 케이스 번호)를 출력한 뒤, 번호를 출력한다.
2. 코드
큐를 이용하여 문제를 풀었습니다. 먼저 들어온 피자부터 검사하며 치즈가 다 녹은 경우 빼고 새로운 피자를 넣고, 아닌 경우 그대로 다시 넣어서 반복문을 실행하도록 하였습니다.
아래가 작성한 코드입니다.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
T = int(input())
for tc in range(1, T+1):
N, M = map(int, input().split())
C = list(map(int, input().split()))
# N개의 피자를 미리 넣어둠
q = list(range(N))
while len(q):
# 가장 먼저 들어온 피자를 검사
check = q.pop(0)
# 치즈를 반으로 나눈 뒤 결과 검사
C[check] = C[check]//2
# 치즈가 다 녹은 경우
if C[check] == 0:
# 더 넣을 피자가 있는지 검사
if N < M:
# 있으면 새로운 피자를 넣음
q.append(N)
# 다음에 넣을 피자 번호 생성
N += 1
# 다 녹지 않은 경우 다시 넣음
else:
q.append(check)
print('#{} {}'.format(tc,check+1))
|
'python' 카테고리의 다른 글
| [파이썬 S/W 문제해결 기본] 6일차 - 미로의 거리 Python (SW Expert Academy) (0) | 2020.04.04 |
|---|---|
| 연구소 Python (BEAKJOON) (0) | 2020.04.01 |
| 로봇 청소기 Python (BEAKJOON) (0) | 2020.03.31 |
| 단지번호붙이기 Python (BEAKJOON) (0) | 2020.03.30 |
| 스타트와 링크 Python (BEAKJOON) (0) | 2020.03.29 |