알고리즘

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

아람2 2025. 2. 20. 11:59
반응형

1. 문제 

안에 숫자가 적힌 풍선 N 개가 원형으로 놓여져 있을 때 
1번을 터뜨려 안에 적힌 숫자만큼 이동해 풍선을 터뜨리는 문제 
숫자가 양수이면 오른쪽, 음수이면 왼쪽으로 이동한다  

2. 제한

시간 제한 2초 
메모리 제한 4MB 

 

3. 알고리즘 분류 

* 자료 구조

* 덱

 

4. 접근 방식 

풍선들이 원형 구조를 이루고 있기 때문에 Deque 을 사용한다 

🐣 정글에서도 많은 칭구들이 처음에 혼란을 겪었지만 Deque 는 디큐가 아니고 이라고 읽는다 🐣

Deque 는 양쪽 끝에서 삽입과 삭제가 모두 O(1) 이기 때문에 원형 리스트를 다루는 데 효과적이다 

풍선을 왼쪽 또는 오른쪽으로 이동해야 하므로, Deque 앞/ 뒤에서 쉽게 풍선을 넣고 뺄 수 있다 

풍선을 터뜨린 후에 해당 풍선을 삭제해야 하는데, 이 때 Deque 를 사용하여 

풍선의 순서를 관리하고 터뜨릴 풍선을 선택하면 효율적으로 진행할 수 있다 

 

풍선 안에 적힌 숫자 move 가 양수일 경우, 오른쪽으로 이동해야 한다 

자기 자신을 제외하고 나머지를 이동해야 하므로 move 에 -1 을 해줘서 move-1 만큼 이동한다 

rotate 는 기본적으로 음수 값을 쓰면 왼쪽으로 이동하고, 양수 값을 쓰면 오른쪽으로 이동하는데 

오른쪽으로 move 만큼 이동한 것과 왼쪽으로 move-1 만큼 이동한 것은 같은 결과를 가진다
🐣 오른쪽으로 이동하게 되면 리스트의 길이를 고려해야 해서 왼쪽으로 이동하는 게 직관적이다  

그래서 move-1 을 음수로 바꾸어 (-(move-1)) 을 사용하면 해당 숫자를 맨 앞으로 이동시킬 수 있다 

5. 전체 코드 w/ Python 

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

# 1번부터 N번까지 N개의 풍선이 원형으로 놓여져 있다 
# 1번 풍선을 터뜨리고 안에 있는 종이를 꺼내어 
# 그 종이에 적혀있는 값만큼 이동하여 다음 풍선을 터뜨린다 
# 양수가 적혀 있을 때는 오른쪽, 음수는 왼쪽으로 이동한다 
# 이동할 때 이미 터진 풍선은 빼고 이동한다 
# 각 풍선 안의 종이에 적혀 있는 수가 주어질 때 
# 터진 풍선의 번호를 차례로 나열한다 

from collections import deque
import sys 

n = int(input()) # 풍선의 개수
# 풍선 안에 적힌 숫자 입력 받으면서 (풍선 번호, 적힌 숫자) 튜플 형태로 저장 
balloon = deque(enumerate(map(int, input().split()), start=1))
result = [] # 결과를 저장할 리스트  

# 첫번째 풍선 터뜨리기, num 은 풍선 번호 move 은 적힌 (이동할) 숫자
num, move = balloon.popleft() 
result.append(num)

while balloon:
    # 양수이면 오른쪽으로 이동, -1은 자기 자신 제외
    if move > 0:
        balloon.rotate(-(move-1))
    # 음수면 왼쪽으로 이동 
    else:
        balloon.rotate(-move)
    
    # 다음 풍선 터뜨리기 
    num, move = balloon.popleft()
    result.append(num)

# 리스트의 원소를 공백 기준으로 펼쳐서 출력하기 
print(*result)
반응형