개발하자

[백준][Java] 2346번 풍선 터뜨리기 본문

Algorithms/Baekjoon

[백준][Java] 2346번 풍선 터뜨리기

개발리미 2025. 4. 26. 19:56
728x90

안녕하세요 :)

적어도 하루 1개 이상 알고리즘 문제를 해결하려 노력하고 있습니다.

혼자 해결 가능한 문제도 있고, 어려웠던 문제도 있던 차라 복습하고자  글을 써 내려갑니다.

 


 

백준 2346 풍선 터뜨리기

이 문제는 풍선에 적힌 숫자에 따라 양방향으로 이동하며 풍선을 터뜨리는 시뮬레이션 문제입니다.

 

📘 문제

 

💡 해결 방법

풍선의 번호와 이동할 값을 같이 저장해야 하므로 int[] 배열을 사용합니다. (번호, 이동값)

풍선들을 Deque(덱)에 넣고, 풍선을 터뜨리면서 이동값에 따라 덱을 회전시킵니다.

이동값이 양수일 경우 덱을 앞으로, 음수일 경우 덱을 뒤로 회전합니다.

 

✅ 풀이 및 설명 (설명은 더보기 클릭)

더보기

 

  • int[] 배열로 번호와 이동값을 같이 저장했습니다.
  • move가 양수이면 오른쪽으로, 음수이면 왼쪽으로 회전합니다.
  • move > 0일 때는 (move - 1)번 이동해야 하고, move < 0일 때는 move번 이동해야 합니다.
  • 풍선을 터뜨릴 때마다 번호를 출력합니다.

 

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int n = Integer.parseInt(br.readLine());

        StringTokenizer st = new StringTokenizer(br.readLine());
        Deque<int[]> deque = new ArrayDeque<>();
        
        // 풍선 번호와 이동 값을 같이 저장
        for (int i = 1; i <= n; i++) {
            deque.offer(new int[]{i, Integer.parseInt(st.nextToken())});
        }

        while (!deque.isEmpty()) {
            int[] balloon = deque.pollFirst();
            int move = balloon[1];
            bw.write(balloon[0] + " ");  // 풍선 번호 출력

            if (deque.isEmpty()) break;  // 풍선이 모두 터졌으면 종료

            if (move > 0) {
                // 오른쪽으로 move-1번 이동
                for (int i = 1; i < move; i++) {
                    deque.offerLast(deque.pollFirst());
                }
            } else {
                // 왼쪽으로 move번 이동
                for (int i = 0; i < Math.abs(move); i++) {
                    deque.offerFirst(deque.pollLast());
                }
            }
        }

        bw.flush();
        bw.close();
        br.close();
    }
}

 

이번 문제는 덱을 활용하여 순서를 조정하는 시뮬레이션 문제였습니다.

덱을 사용하면 양쪽 끝에서 데이터를 빠르게 추가하거나 삭제할 수 있기 때문에 이런 회전이 필요한 문제에서 매우 유용합니다.

이 문제를 통해 덱 회전 로직과 조건에 따른 분기 처리를 연습할 수 있습니다.

 


공부하면서 유용했던 부분 메모 겸 공유하고자 끄적입니다.

고쳐야 하는 부분 있다면 댓글 남겨주시면 수정하겠습니다.

행복한 하루 보내세요 (❁´◡`❁)

728x90
반응형