본문 바로가기
PS

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

by 3급우사기 2024. 8. 26.

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

큐를 이용한 문제다.

처음에 문제를 잘못이해해서 삽질을 좀 했다.

그리고 큐 회전하는거 숫자가 너무 헷갈렸다.

문제 설명
  1. 처음에는 1번부터 n번까지 번호가 매겨진 풍선들이 일렬로 배치되어있다.
  2. 첫 번째 풍선을 터뜨리고, 그 안에 적힌 숫자만큼 왼쪽이나 오른쪽으로 이동하여 다음 풍선을 터뜨린다. 양수는 오른쪽, 음수는 왼쪽으로 이동하는 것을 의미한다.
  3. 모든 풍선을 터뜨릴 때까지 이 과정을 반복한다.
  4. 터뜨린 풍선의 순서를 출력한다.
문제 풀이

 

풍선들의 번호를 큐에 넣고, 주어진 숫자만큼 큐를 회전시키는 방식으로 문제를 해결했다.

  1. 입력 처리:
    • 첫 번째 입력으로 풍선의 개수 n
    • 두 번째 입력으로 각 풍선에 적힌 숫자
  2. 큐 초기화:
    • 큐에 1번부터 n번까지의 번호를 차례대로 넣음.
    • 첫 번째 풍선을 터뜨리고, 그 번호를 출력합니다.
  3. 큐 회전:
    • 현재 터뜨린 풍선에 적힌 숫자만큼 큐를 회전시킨다. 이때, 큐의 왼쪽이나 오른쪽으로 이동할 방향을 결정한다.
    • 음수는 왼쪽으로 회전(음수 값), 양수는 오른쪽으로 회전(-양수 값)합니다. 한 번 풍선을 터뜨렸다면 그 숫자에서 1을 뺀 만큼 회전해야 한다.
  4. 반복:
    • 큐에서 풍선을 하나씩 꺼내며 위의 과정을 반복.
    • 큐가 비게 되면 모든 풍선을 터뜨린 것이므로 종료.
  5. 출력:
    • 풍선을 터뜨린 순서대로 번호를 출력.

 

import sys
from collections import deque

n = int(sys.stdin.readline())
queue = deque(list(i+1 for i in range(n)))
arr = list(map(int, sys.stdin.readline().split()))

# 첫 번째 풍선을 터뜨림
tmp = queue.popleft()
print(tmp, end=' ')

# 큐가 빌 때까지 반복
while queue:
    if arr[tmp-1] > 0:
        queue.rotate(-arr[tmp-1] + 1)  # 오른쪽 회전
    else:
        queue.rotate(-arr[tmp-1])  # 왼쪽 회전

    tmp = queue.popleft()  # 다음 풍선 터뜨리기
    print(tmp, end=' ')

'PS' 카테고리의 다른 글

[백준] 24511번: queuestack 파이썬 풀이  (0) 2024.09.23
코딩테스트 파이썬 입출력 문법 정리  (0) 2024.02.27