본문 바로가기
백준

[백준] 2346번 : 풍선 터뜨리기 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트

by 우당탕탕 개발자 2023. 12. 6.
728x90
반응형

 

 

2346번: 풍선 터뜨리기

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

www.acmicpc.net

 

1. 문제 설명

2. 풀이과정

해당 문제는 풍선 안의 종이에 적혀 있는 숫자에 따라 풍선을 모두 터뜨리는 문제이다.

먼저 1번 풍선을 터뜨리고 풍선 안의 종이에 적혀 있는 숫자를 확인해 다음 풍선을 터뜨린다.

숫자가 양수이면 숫자의 크기만큼 뒤로 이동하고, 숫자가 음수이면 앞으로 이동한다.

풍선을 터뜨려도 풍선의 위치가 변하면 안 되기 때문에 처음에 입력받은 풍선의 위치와 종이에 적혀 있는 숫자를 하나의 리스트로 묶어 deque 자료에 저장한다.

이후 숫자의 크기만큼 풍선의 순서를 움직이며 다음 풍선을 터뜨리면 된다.

 

  1. sys.stdin.readline() 함수를 사용하기 위해 sys 모듈을 불러온다. import sys
  2. deque 자료구조를 사용하기 위해 deque 함수를 불러온다. from collections import deque
  3. 풍선의 개수를 입력받고 N = int(sys.stdin.readline())
  4. 풍선 안의 종이에 적혀 있는 수를 입력받아 리스트로 저장한다. li = list(map(int, sys.stdin.readline().split()))
  5. 풍선의 위치 (1번부터 시작)와 풍선 안의 종이에 적혀 있는 수를 하나의 리스트로 묶어 deque 자료구조로 만들어 준다. d = deque([i + 1, li[i]] for i in range(N))
  6. 터뜨릴 해당 풍선을 저장할 변수를 생성하고 처음에는 1번 풍선을 터뜨린다. balloon = d.popleft()
  7. 터뜨린 풍선의 위치를 줄 바꿈 없이 출력한다. print(balloon[0], end=' ')
  8. 풍선을 모두 터뜨릴 때까지 반복하며 while (d)
  9. 만약 터뜨린 풍선 안의 종이에 적혀 있는 수가 양수이면 if (balloon[1] > 0)
  10. 종이에 적혀 있는 수 전까지 반복하며(숫자의 크기 - 1만큼 반복) for _ in range(balloon[1] - 1)
  11. 풍선을 앞에서 뒤로 이동시킨다. d.append(d.popleft())
  12. 반면에 터뜨린 풍선 안의 종이에 적혀 있는 수가 음수이면 else
  13. 종이에 적혀 있는 수부터 0 전까지 반복하며(숫자의 크기만큼 반복) for _ in range(balloon[1], 0)
  14. 풍선의 뒤에서 앞으로 이동시킨다. d.appendleft(d.pop())
  15. 모두 이동시킨 후, 가장 앞에 있는 풍선이 다음으로 터뜨릴 풍선이다. balloon = d.popleft()
  16. 다음 풍선을 터뜨리고 터뜨린 풍선의 위치를 줄 바꿈 없이 공백을 두고 출력한다. print(balloon[0], end=' ')
반응형

3. 소스코드

import sys
from collections import deque

N = int(sys.stdin.readline())

li = list(map(int, sys.stdin.readline().split()))
d = deque([i + 1, li[i]] for i in range(N))

balloon = d.popleft()
print(balloon[0], end=' ')

while (d):
    if (balloon[1] > 0):
        for _ in range(balloon[1] - 1):
            d.append(d.popleft())

    else:
        for _ in range(balloon[1], 0):
            d.appendleft(d.pop())

    balloon = d.popleft()
    
    print(balloon[0], end=' ')
728x90
반응형