Gemstone's Devlog

[백준] 2346번: 풍선 터뜨리기 본문

Data Structure & Algorithms

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

Gemstone 2021. 8. 16. 23:32

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

 

2346번: 풍선 터뜨리기

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

www.acmicpc.net

데크(deque)를 활용하여 문제를 해결하였다.

데크(deque)에 존재하는 메서드(method)는 대략 다음과 같다.

  • deque.append(item): item을 데크의 오른쪽 끝에 삽입한다.
  • deque.appendleft(item): item을 데크의 왼쪽 끝에 삽입한다.
  • deque.pop(): 데크의 오른쪽 끝 엘리먼트를 가져오는 동시에 데크에서 삭제한다.
  • deque.popleft(): 데크의 왼쪽 끝 엘리먼트를 가져오는 동시에 데크에서 삭제한다.
  • deque.extend(array): 주어진 배열(array)을 순환하면서 데크의 오른쪽에 추가한다.
  • deque.extendleft(array): 주어진 배열(array)을 순환하면서 데크의 왼쪽에 추가한다.
  • deque.remove(item): item을 데크에서 찾아 삭제한다.
  • deque.rotate(num): 데크를 num만큼 회전한다(양수면 오른쪽, 음수면 왼쪽).

여기서 본인은 rotate 메서드를 활용하여 이 문제를 간단하게 해결하였다.

# Contain 1, 2, 3, 4, 5 in deq
deq = deque([1, 2, 3, 4, 5])

deq.rotate(1)
print(deq)
# deque([5, 1, 2, 3, 4])

deq.rotate(-1)
print(deq)
# deque([1, 2, 3, 4, 5])

 

또한 enumerate와 join 함수를 활용하여 문제를 깔끔하게 해결하였다.

풀이한 소스코드를 한 번 보자.

from collections import deque
import sys
input = sys.stdin.readline
n = int(input())
dq = deque(enumerate(map(int, input().split())))
ans_list = []
print(dq)
while dq:
    idx, num = dq.popleft()
    ans_list.append(idx + 1)
    if num > 0 :
        dq.rotate(-(num - 1))
    elif num < 0 :
        dq.rotate(-num)

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