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

2023. 2. 27. 10:50·Algorithm/백준 (BOJ)
반응형

문제 링크

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


문제

1번부터 N번까지 N개의 풍선이 원형으로 놓여 있고. i번 풍선의 오른쪽에는 i+1번 풍선이 있고, 왼쪽에는 i-1번 풍선이 있다. 단, 1번 풍선의 왼쪽에 N번 풍선이 있고, N번 풍선의 오른쪽에 1번 풍선이 있다. 각 풍선 안에는 종이가 하나 들어있고, 종이에는 -N보다 크거나 같고, N보다 작거나 같은 정수가 하나 적혀있다. 이 풍선들을 다음과 같은 규칙으로 터뜨린다.

우선, 제일 처음에는 1번 풍선을 터뜨린다. 다음에는 풍선 안에 있는 종이를 꺼내어 그 종이에 적혀있는 값만큼 이동하여 다음 풍선을 터뜨린다. 양수가 적혀 있을 경우에는 오른쪽으로, 음수가 적혀 있을 때는 왼쪽으로 이동한다. 이동할 때에는 이미 터진 풍선은 빼고 이동한다.

예를 들어 다섯 개의 풍선 안에 차례로 3, 2, 1, -3, -1이 적혀 있었다고 하자. 이 경우 3이 적혀 있는 1번 풍선, -3이 적혀 있는 4번 풍선, -1이 적혀 있는 5번 풍선, 1이 적혀 있는 3번 풍선, 2가 적혀 있는 2번 풍선의 순서대로 터지게 된다.


풀이

1번 풍선의 왼쪽에 N번 풍선이 있고, N번 풍선의 오른쪽에 1번 풍선이 있으므로 원형큐이다. 파이썬에서 원형큐를 쓰기 위해 deque을 사용했다.

 

(1) 풍선 안의 종이에 적혀 있는 수를 balloon이라는 deque으로 입력받는다.

enumerate()를 이용하여 각 풍선 안의 종이에 적혀 있는 수와 풍선 번호(index)를 함께 형성한다. 예를 들어, 3 2 1 -3 -1을 입력하였을 때, 원래는 deque([3, 2, 1, -3, -1])로 저장되지만, enumerate()를 이용하면 deque([(0, 3), (1, 2), (2, 1), (3, -3), (4, -1)])로 저장된다.

 

(2) 풍선 안의 종이에 적혀 있는 수(tmp)가 양수이면 오른쪽으로 이동한다.

deque 상에서는 왼쪽으로 이동하는 것이므로 rotate() 괄호 안에 음수를 적어야 한다.

tmp가 양수이므로 음수가 되도록 -를 붙여준다.

주의할 점: 1번 풍선을 popleft() 했기 때문에 왼쪽으로 한 번 이동했다고 볼 수 있어 tmp에서 1을 빼줘야 한다.

 

(3) 풍선 안의 종이에 적혀 있는 수(tmp)가 음수이면 왼쪽으로 이동한다.

마찬가지로 deque 상에서는 오른쪽으로 이동하는 것이므로 rotate() 괄호 안에 양수를 적어야 한다.

tmp가 음수이므로 양수가 되도록 -를 붙여준다.


정답 코드

from collections import deque

n = int(input())
balloon = deque(enumerate(map(int, input().split())))

for i in range(n):
    idx, tmp = balloon.popleft()
    print(idx + 1, end=' ')
    if tmp > 0:
        balloon.rotate(-(tmp - 1))
    else:
        balloon.rotate(-tmp)

막힌 부분 (틀린 코드)

from collections import deque

n = int(input())
balloon = deque(map(int, input().split()))
ord = list(balloon)

while balloon:
    tmp = balloon.popleft()
    if tmp > 0:
        balloon.rotate(-(tmp - 1))
    else:
        balloon.rotate(-tmp)
    print(ord.index(tmp) + 1, end=' ')

처음에 enumerate 알지 못하고 풍선의 deque와 같은 list를 생성해서 터진 풍선의 index를 출력하도록 하였다.

반례는 같은 넘버를 가진 풍선이 있을 경우이다.

이 게시글을 통해 enumerate를 알게 되어 enumerate를 이용하여 풀었다.

반응형

'Algorithm > 백준 (BOJ)' 카테고리의 다른 글

[Python] 백준/BOJ 11726번: 2×n 타일링  (0) 2023.03.20
[Python] 백준/BOJ 9095번: 1, 2, 3 더하기  (0) 2023.03.19
[Python] 백준/BOJ 1021번: 회전하는 큐  (0) 2023.02.27
[Python] 백준/BOJ 18258번: 큐 2  (0) 2023.02.26
'Algorithm/백준 (BOJ)' 카테고리의 다른 글
  • [Python] 백준/BOJ 11726번: 2×n 타일링
  • [Python] 백준/BOJ 9095번: 1, 2, 3 더하기
  • [Python] 백준/BOJ 1021번: 회전하는 큐
  • [Python] 백준/BOJ 18258번: 큐 2
올콩
올콩
콩 심은 데 콩 난다
  • 올콩
    콩스토리
    올콩
  • 전체
    오늘
    어제
    • 분류 전체보기 (196) N
      • SSAFY (10)
      • Algorithm (114) N
        • 이론 (6)
        • 백준 (BOJ) (107) N
        • 프로그래머스 (1)
      • Trouble Shooting (9)
      • Frontend (6)
      • React (17)
      • Next.js (4) N
      • Vue (4)
      • Node.js (2)
      • HTML (9)
      • DevOps (4)
        • Git (4)
      • Language (9)
        • JavaScript (0)
        • Java (9)
      • Embedded (1)
      • CS (5)
        • Network (1)
        • Blockchain (4)
      • 자격증 (2)
  • 블로그 메뉴

    • GitHub
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    구현
    힙
    백트래킹
    html5
    우선순위큐
    중복조합
    bfs
    오블완
    SSAFY
    재귀
    파이썬
    브루트포스
    Java
    DP
    티스토리챌린지
    Error
    알고리즘
    dfs
    Algorithm
    블록체인
    강의
    Heap
    Next.js
    백준
    React
    중복순열
    SSAFYcial
    수학
    순열
    싸피
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
올콩
[Python] 백준/BOJ 2346번: 풍선 터뜨리기
상단으로

티스토리툴바