파란색가운의 개발 블로그
[백준] 2346번 덱 풍선 터뜨리기 본문
https://www.acmicpc.net/problem/2346
문제
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은 적혀있지 않다.
출력
첫째 줄에 터진 풍선의 번호를 차례로 나열한다.
예제 입력 1 복사
5
3 2 1 -3 -1
예제 출력 1 복사
1 4 5 3 2
후기: 역시 난 하찮았다
import sys
from collections import deque
N = int(input())
queue = deque(enumerate(map(int,sys.stdin.readline().split())))
ans = []
while queue:
index, jump = queue.popleft()
ans.append(index + 1) # 방문 순서
if jump > 0:
queue.rotate(-jump + 1) # (jump -1 ) 만큼만 땡겨와야됨.. 이미 Popleft 조져서
else:
queue.rotate(-jump)
for i in ans:
print(i,end=' ')
enumerate : index , element를 동시에 제공해주는 기능
너무 좋다 ~ (0,33) (1,2) 이런식으로 자동으로 넣어줌
rotate (3) -> 3칸만큼 오른쪽으로 회전
rotate(-2) -> 2칸만큼 왼쪽으로 회전
말이 회전이지. 그냥 밀어준다고 생각하면 된다.
저거 없이 구현하려면 pop() -> appendleft() 조져주면, 맨 뒤에꺼를 맨 앞에다가 붙이는 행위
만약 jump가 0보다 크다면, "내가 오른쪽으로 jump만큼 가야 하는것"
이미 큐에서 popleft를 해줬으므로 (- (jump-1))만큼만 회전시킨다.
즉 jump - 1만큼 배열을 왼쪽으로 끌어와서 -> 그 원소가 0번째에 위치하게 만든다.
만약 jump가 0보다 작다면, 현재의 인덱스에서 왼쪽으로 가야한다
[1,2,3,4,5]에서 내가 현재 1의 출발지에 있고, 2만큼 왼쪽으로 가야한다면 jump = -2겠지?
-jump만큼 (2칸 오른쪽)으로 밀면 [4,5,1,2,3]이 되므로
jump가 양수라면 - (jump -1)만큼 , jump가 음수라면 -jump만큼 rotate시켜주면 된다.
오늘 어려운거 배웠다 ㅎ... 잘 써먹자
'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글
[백준] 1904 다이나믹 프로그래밍 01타일 (1) | 2024.08.28 |
---|---|
[백준] 다이나믹 프로그래밍 2839 설탕 배달 (0) | 2024.08.13 |
[백준] 백트래킹 15649 N과 M(1) (0) | 2024.07.21 |
[백준] 구현 1138 한 줄로 서기 (0) | 2024.07.06 |
[백준] 구현 14890 경사로 파이썬 풀이 (2) | 2024.05.26 |