본문 바로가기

알고리즘/python

[python/파이썬] 백준 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

 

 

[소스 코드]

이번 문제도 index값이 담긴 list를 이용해야 하는 문제다. 아마 테스트 케이스가 1부터 N까지의 숫자가 주어지기 때문인 것 같다.

data -> 풍선 속 숫자

idx -> 터뜨려야 할 풍선의 인덱스

nxt -> 터뜨린 풍선 속 숫자

result -> 결과를 저장하기 위한 리스트

index_list -> 인덱스 값을 저장하기 위한 리스트

 

처음 시작은 첫번째 풍선을 터뜨리기 때문에 while문이 시작하기 전에 풍선 속 숫자를 nxt에 저장하고 몇 번째 풍선을 터뜨렸는지 index_list에 저장한다.

 

만일 풍선속 숫자가 음수일 경우 0에서 계산되기 때문에 괜찮으나

양수일 경우는 1 차이가 나기 때문에(리스트의 인덱스는 0부터 시작하나 풍선 번호는 1부터 시작하기 때문)

if-else문으로 처리를 해줘야 한다.

풍선 속 숫자만큼 더해주었을 때 풍선의 개수보다 큰 수가 된다면 다시 첫 번째 풍선부터 돌기 때문에 나머지 연산을 해줘야 한다.

idx값을 저장해준 후 풍선을 터뜨리는 과정을 진행한다.

n = int(input())
data = list(map(int,input().split()))
idx = 0
nxt =0
result = []
index_list = []

for i in range(1,n+1):
    index_list.append(i)
 
nxt = data.pop(idx)
result.append(index_list.pop(idx))
while data:
    if(nxt<0):
        idx = (idx+nxt)%len(data)
    else:
        idx = (idx+(nxt-1))%len(data)
    nxt = data.pop(idx)
    result.append(index_list.pop(idx))

for i in result:
	print(i, end=" ")
반응형