알고리즘/백준

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

Coblin 2021. 8. 29. 23:54
반응형

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

 

2346번: 풍선 터뜨리기

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

www.acmicpc.net

문제 설명

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번 풍선의 순서대로 터지게 된다.

제한 조건

첫째 줄에 자연수 N(1 ≤ N ≤ 1,000)이 주어진다.

다음 줄에는 차례로 각 풍선 안의 종이에 적혀 있는 수가 주어진다.

종이에 0은 적혀있지 않다.

입출력 예

첫째 줄에 터진 풍선의 번호를 차례로 나열한다.

N 각 풍선 안의 종이에 적혀있는 수 answer
5 3 2 1 -3 -1 1 4 5 3 2

answer

from collections import deque

def solution(n, queue):
    # 풍선이 터진 순서를 담아둘 리스트 변수 선언
    answer = []

    while queue:
        # queue의 첫번째 요소를 pop
        val = queue.popleft()
        # pop 한 첫번째 요소의 인덱스값 에 +1 하여 answer에 삽입
        answer.append(val[0]+1)
            
        if queue and val[1] > 0:
            # queue에 값이 존재하고 val[1](풍선의 값)이 양수일때 해당 값 만큼 queue를 회전
            queue.rotate(-(val[1]-1))
        else:
            # val[1](풍선의 값)이 음수 일때 해당 값 만큼 회전
            queue.rotate(-val[1])

    # 리스트의 요소를 띄어쓰기 형태로 리턴
    return ' '.join(map(str, answer))

if __name__ == "__main__":
    # 입력값
    n = int(input())
    
    # 문제에 맞는 제한 조건 설정(1 ≤ N ≤ 1,000)
    if 1 <= n <= 1000:
        # 풍선에 적혀 있는 값을 입력받고 띄어쓰기 기준으로 split하고 요소를 map을 통해 int로 형변환 한뒤 enumerate로 index값과 value를 튜플형태로 deque형태로 변수에 저장한다.
        queue = deque([(index, value) for index, value in enumerate(map(int, input().split()))])

        print(solution(n, queue))

큐, 스택, 덱(데크) 문제를 고른 거라 접근방식에서 고민할 필요가 없던 문제였다.

어떤 흐름으로 코드를 작성하면 되겠다 라는 생각을 갖고 테스트 케이스를 계속 돌렸지만 큐를 회전하는(queue.rotate) 부분에서 어떠한 값이 들어가야 하는지 한참이나 삽질을 해버렸다. IDE에서 테스트 케이스를 돌렸을 때 원하는 출력 값이 나와 백준에 제출하니 오답이 나와 일차 멘붕을 겪었고 확인해 보니 join을 사용하지 않고 리스트 상태로 넣었다는 걸 뒤늦게 깨달아 다시 제출하니 또다시 오답 처리가 되어 이차 멘붕이 와버렸다.

많은 삽질 끝에 정답에 해당하는 값을 찾았지만 멘탈이 나가버린 상태로 생각 없이 값만 바꿔가며 돌려서 그런 건지 공간지각 능력이 부족한 건지 배열이 회전되었을 때의 값이 그려지지 않아 100% 이해하지 못해 만족스러운 풀이를 하진 못했습니다.

혹시나 queue.rotate(-(val[1]-1))이 이해하신 분이 계시다면 댓글로 알려주시면 감사하겠습니다!

반응형