https://www.acmicpc.net/problem/2346
조건
- 1~N까지 N개의 풍선이 원형으로 놓여있다.
- i번 풍선 오른쪽에는 i+1,왼쪽에는 i-1. 단, 1번의 풍선의 왼쪽에는 N번 풍선. N번 풍선의 오른쪽에는 1번 풍선이 존재.
- 각 풍선에는 종이가 들어있고, 종이에는 -N≤n≤N 인 숫자 n이 존재함.
- 제일 처음에는 1번 풍선을 터뜨리고, 다음에는 풍선 안에 있는 종이를 꺼내어, 그 종이에 적혀있는 값 만큼 이동하여, 다음 풍선을 터뜨림.
입력
- 첫째 줄에는 자연수 N,다음 줄에는 차례로 각 풍선 안의 종이에 적혀있는 수가 주어짐. (0은 적혀있지않다)
SOL)
이 문제는 큐를 사용하면 쉽게 해결 가능할거 같음. 딱 봐도, 첫번째 인덱스에서만 Pop되는 상황이고, 해당 값이 들어있는 index만 찾으면 되니까.
근데, 여기서 몇가지 더 생각해줘야 할게있음!
- rotate는 배열이 움직임. 내가 가리키는 손?화살표?Cusor가 움직이는게 아님!
- 그래서, 배열자체가 움직이기 때문에, rotate는 -를 붙여줘서 역방향으로 돌아야함.
- 또, rotate를 할 때, 풍선안의 숫자가 양수냐 음수냐에 따라 횟수가 다른지 봐야함. (보통, 왼쪽으로 가면 1번 더 가야하더라)
- 풍선안의 숫자가 양수 → number -1 만큼 rotate하면됨.
- 풍산안의 숫자가 음수 → number 만큼 rotate하면 됨.
몇번 시뮬레이션 해보면, 위의 생각해줘야 하는것들은 이해가 빠르게 되니, 예시를 1개 두고 하나씩 해보길 바람!
from collections import deque
import sys
n=int(input())
papers = enumerate(map(int,input().split()))
#enumerate는 idx값과 value 값이 함께오는 아주 편리한 친구임.
#papers = list(map(int,input().split()))
ans =[]
dq = deque(papers)
while dq:
idx,temp=dq.popleft()
# idx=papers.index(temp) 값이 같을때, 첫번째 인덱스가 계속 반환됨.
ans.append(idx+1)
if temp>0:
dq.rotate(-(temp-1))
elif temp<0:
dq.rotate(-temp)
for number in ans:
print(number,end=' ')
'알고리즘 문제(SOL)' 카테고리의 다른 글
[백준/1743/파이썬] 음식물 피하기 (0) | 2021.11.18 |
---|---|
[백준/1406/파이썬] 에디터 (0) | 2021.11.18 |
[백준/1158/파이썬] 요세푸스 문제 (0) | 2021.11.09 |
[백준/1021/파이썬] 회전하는 큐 (0) | 2021.11.08 |
[Python,자료구조] Data structure (0) | 2021.11.07 |