다국어 문제이므로 이해를 위해 예시를 통해 짧게 설명을 해보자면 다음과 같다.
N 으로 4가 주어지면 4명의 사람이 있는데, 이들이 각각 1 3 1 4 라는 의미는 각각 자신이 필요한 피자의 갯수이며 피자는 1번 사람부터 순서대로 1초마다 제공된다.
따라서 힌트에 나와있는 것처럼 피자를 받는 사람 번호를 일일이 기록해보면
1 2 3 4 2 4 2 4 4 가 되고,
여기서 각자 마지막으로 피자를 받은 순간이 피자 수령을 완료한 시점이기 때문에 결과는 1 7 3 9 가 되는 것이다!
(각 숫자마자 제일 나중에 나온 인덱스+1 을 결과로 하여 출력하는 셈)
N = int(input())
A = list(map(int, input().split())) # 1 3 1 4
pizza = {i + 1 : A[i] for i in range(N)} # 딕셔너리 생성 : {1 : 1, 2 : 3, 3 : 1, 4 : 4}
record = [] # 각 사람마다 피자를 받은 시점에 기록해둔 리스트
result = {} # 각 사람마다 걸린 최종 시간 저장한 결과
while pizza:
for i in list(pizza.keys()):
if not pizza: break
if (pizza[i] == 1): # 피자 1개인 경우
record.append(i)
del pizza[i] # pizza.pop(i)
else: # 피자가 2개 이상인 경우
record.append(i)
pizza[i] -= 1
for i in range(len(record) - 1, -1, -1):
if record[i] not in result:
result[record[i]] = i + 1
print(' '. join(str(result[key]) for key in sorted(result)))
- pizza 딕셔너리를 생성하여 키는 1번 부터 사람들의 번호, value 값을 각 사람들마다 수령해야 할 피자의 개수를 의미
- record는 각 사람마다 피자를 받은 시점에 기록해둔 리스트 [1, 2, 3, 4, 2, 4, 2, 4, 4]
- result 는 각 사람마다 걸린 최종 시간 저장한 결과
반복문을 설정하여 pizza 딕셔너리가 빌 때까지 내부의 반복문을 돌리도록 설정
- pizza.keys() 에 있는 N 명의 사람들을 계속 순회하면서 피자를 배부
- 피자를 한 번 수령 했으므로 record 리스트에 기록하기 위해 record.append(i)를 진행
- 이때 피자를 한 개씩 받을 때마다 받아야할 피자 수는 감소하므로 pizza[i] -= 1
- 피자가 1개인 경우는 아예 딕셔너리에서 없애줘야 하므로 del pizza[i] 를 진행해준다.
출력 시에는 제일 나중에 나온 인덱스가 피자를 수령한 시간이므로 인덱스 슬라이싱을 통해 조정하여 출력해준다.
'Python' 카테고리의 다른 글
[백준/Python] 11726 : 2xn 타일링 (0) | 2024.11.03 |
---|---|
[백준/Python] 11659 : 구간 합 구하기 4 (1) | 2024.11.03 |
[백준/Python] 12789 : 도키도키 간식드리미 (0) | 2024.11.03 |
[백준/Python] 1541 : 잃어버린 괄호 (0) | 2024.11.03 |
[백준/Python] 11074 : 동전 0 (0) | 2024.11.02 |