1번부터 N번까지 N개의 풍선이 원형으로 놓여 있고. i번 풍선의 오른쪽에는 i+1번 풍선이 있고, 왼쪽에는 i-1번 풍선이 있다. 단, 1번 풍선의 왼쪽에 N번 풍선이 있고, N번 풍선의 오른쪽에 1번 풍선이 있다. 각 풍선 안에는 종이가 하나 들어있고, 종이에는 -N보다 크거나 같고, N보다 작거나 같은 정수가 하나 적혀있다. 이 풍선들을 다음과 같은 규칙으로 터뜨린다.
우선, 제일 처음에는 1번 풍선을 터뜨린다. 다음에는 풍선 안에 있는 종이를 꺼내어 그 종이에 적혀있는 값만큼 이동하여 다음 풍선을 터뜨린다. 양수가 적혀 있을 경우에는 오른쪽으로, 음수가 적혀 있을 때는 왼쪽으로 이동한다. 이동할 때에는 이미 터진 풍선은 빼고 이동한다.
예를 들어 다섯 개의 풍선 안에 차례로 3, 2, 1, -3, -1이 적혀 있었다고 하자. 이 경우 3이 적혀 있는 1번 풍선, -3이 적혀 있는 4번 풍선, -1이 적혀 있는 5번 풍선, 1이 적혀 있는 3번 풍선, 2가 적혀 있는 2번 풍선의 순서대로 터지게 된다.
첫째 줄에 자연수 N(1 ≤ N ≤ 1,000)이 주어진다. 다음 줄에는 차례로 각 풍선 안의 종이에 적혀 있는 수가 주어진다. 종이에 0은 적혀있지 않다.
첫째 줄에 터진 풍선의 번호를 차례로 나열한다.
from collections import deque
N = int(input())
q = deque(enumerate(map(int,(input().split()))))
# enumerate를 사용하여 index와 풍선 속 종이값이 같이 나오게 한다.
ans = []
while q:
idx, paper = q.popleft()
ans.append(idx+1)
if paper > 0:
q.rotate(-(paper-1))
else:
q.rotate(-paper)
print(*ans)
처음에 접근할 때는 idx를 0으로 두고 paper에 적힌 값들을 idx에 더해가면서 visited 처리도하고 그랬다.
구현은 어찌어찌 가능했지만 코드가 너무 복잡하고 가독성도 좋지 않아서 조금 써치를 했다.
enumerate를 이용하여 값과 idx를 동시에 다루기 때문에 q에서 Pop을 하더라도 초기의 idx가 남아있기 때문에 쓰기 좋은 문제인 것 같다.
deque의 가장 큰 장점이 아닐까? popleft를 고정으로 두고 paper 값에 따라 해당 값을 맨 왼쪽으로 가져오면 된다.
q.rotate(숫자) 형식으로 쓸 수 있는데
숫자가 양수일 경우,
q = [1,2,3]
ex) q.rotate(1)
q [3,1,2]
가장 끝에 있는 값을 맨 왼쪽으로 가져왔다.
rotate가 익숙하지 않기 때문에 다음 번에 다시 적용할 때는 이걸 적어놓고 rotate내의 변수를 잘 설정할 수 있을 것이다.
paper > 0일 때, rotate(-(paper-1))로 되어있는 것이 이해가 됐다면 이 문제는 다 이해한 것이다.
예를 들어, q = [3, 2, 1, -3, -1]
초기 idx는 0이고 해당 값에 있는 paper 값은 3이다.
그러면 그 다음에 pop 되어야 하는 숫자는
q[3]이다. 해당 값이 가장 왼쪽으로 오기 위해선
rotate를 왼쪽으로 2칸을 해주면 된다.
2라는 숫자는 paper-1이기 때문에 -(paper-1)이다.
손으로 q의 내용을 적어보면서 rotate를 적어보는 것을 추천한다!!