Koala - 11기/코딩테스트 준비 스터디

[백준/Python] 2346번: 풍선 터뜨리기

계란소년 2023. 8. 13. 15:20

문제

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

 

2346번: 풍선 터뜨리기

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

www.acmicpc.net


코드

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

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

    if cnt>=0:
        idx,paper=q.popleft()
    else:
        idx,paper=q.pop()
    ans.append(idx+1)
    if len(q)==0:
        break
    cnt=0
    if abs(paper)-1 ==0:
        if paper>0:
            cnt+=1
        else:
            cnt-=1
    else:
        for i in range(abs(paper)-1):
            if paper>0:
                q.append(q[0])
                q.popleft() 
                cnt+=1
            elif paper<0:
                q.appendleft(q[-1])
                q.pop()
                cnt-=1
print(' '.join(map(str, ans)))

설명

처음에는 arr이라는 리스트를 만들어서 [1,2,3,4,5]로 덱이랑 연결을 해주려고 생각했으나, enumerate를 사용하는것이 더 간편하다고 판단하여 enumerate를 사용하였다.

ans는 새로 넣어줄 리스트이다.

+일때는 cnt를 더해서 양수로 만들어주고

-일때는 cnt를 빼서 음수로 만들어줘서

오른쪽으로 이동할지, 왼쪽이로 이동할지를 정해주었다.

풍선의 절댓값이 1일경우는 이동하지 않고 왼쪽, 오른쪽만 정해야 하므로 조건식을 사용하여 정해주었다.

 

rotate라는 기능을 사용하는것이 훨씬 수월하긴 하나, 이 기능없이 구현해보고싶었다.

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)))