알고리즘 문제(SOL)

[백준/2346/파이썬] 풍선 터뜨리기

https://www.acmicpc.net/problem/2346

 

2346번: 풍선 터뜨리기

1번부터 N번까지 N개의 풍선이 원형으로 놓여 있고. i번 풍선의 오른쪽에는 i+1번 풍선이 있고, 왼쪽에는 i-1번 풍선이 있다. 단, 1번 풍선의 왼쪽에 N번 풍선이 있고, N번 풍선의 오른쪽에 1번 풍선

www.acmicpc.net

조건

  • 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=' ')