코딩테스트[파이썬]/백준 (BOJ)

백준 2346 - 풍선터트리기 [큐]

softmoca__ 2024. 2. 16. 16:15
목차

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

 

2346번: 풍선 터뜨리기

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

www.acmicpc.net

 

 

 

from collections import deque
dq=deque()
n=int(input())

arr=list(map(int,input().split()))
for idx,val in enumerate(arr):
    dq.append([idx+1,val])

x=dq.popleft()[1]
res=[1]

while dq:
    if x>0:
        for _ in range(x-1):
            if dq:
                dq.append(dq.popleft())
        if dq:
            xx,yy=dq.popleft()    
            x=yy
            res.append(xx)
    if x<0:
        for _ in range(-1-x):
            if dq:
                dq.appendleft(dq.pop())
        if dq:
            xx,yy=dq.pop()
            x=yy
            res.append(xx)

for x in res:
    print(x,end=' ')

 

큐를 사용해서 구현하긴 했지만 테스트 케이스를 제외한 다른 입력값에서 런타임 에러가 나왔다.

반례를 찾을 수 없어 우선 큐가 있을 때만 로직을 수행하게 해서 정답 판정을 받긴했지만 너무 않좋은 코드 같다..!

 

 

다른 좋은 코드

 

 

 

 

 

import sys
from collections import deque
input = sys.stdin.readline

n = int(input())
q = deque(enumerate(map(int, input().split())))
ans = []

while q:
    idx, paper = q.popleft()
    ans.append(idx + 1)

    if paper > 0:
        q.rotate(-(paper - 1))
    elif paper < 0:
        q.rotate(-paper)

print(' '.join(map(str, ans)))

 

pop을 하면 가리키는 곳은 시계방향의 다음 원소가 된다.

 

참조

https://velog.io/@hygge/Python-%EB%B0%B1%EC%A4%80-2346-%ED%92%8D%EC%84%A0-%ED%84%B0%EB%9C%A8%EB%A6%AC%EA%B8%B0-deque