백준 2346 풍선 터트리기[JAVA]

Ga0·2023년 8월 15일
0

baekjoon

목록 보기
86/125

문제 해석

  • 첫번째 줄에는 풍선의 개수(N)를 입력받고, 입력받은 풍선의 개수만큼 다음 차례에 터트릴 풍선의 위치(상대 값 ; 이동 값)을 입력받는다.
  • 입력받은 이동 값들 순서대로 터트리는데 이때 터트린 풍선의 위치(절대 값)을 출력하면 된다. (처음 터트리는 풍선이 첫번째 풍선(1번)이다.
  • 말로만 설명했을 땐 한번에 이해하기 어려울 수 있는데 쉽게 설명하자면 아래의 사진과 같다.

코드

import java.io.*;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.StringTokenizer;


public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        Deque<Balloon> queue = new ArrayDeque<>();

        int N = Integer.parseInt(br.readLine()); //풍선의 개수

        StringTokenizer st = new StringTokenizer(br.readLine());

        int[] balloonLocation = new int[N];
        for (int i = 0; i < N; i++) {
            balloonLocation[i] = Integer.parseInt(st.nextToken());
        }

        br.close();
        sb.append("1 "); //무조건 첫번째 풍선 먼저 터트리기 때문
        int moveValue = balloonLocation[0]; //움직여야할 이동 값

        //인덱스값과 인덱스가 가지고 있는 이동 값을 같이 넣어준다.
        // i+1 : (처음 풍선은 넣어주지 않음) => 가장 처음 터트리기 때문
        for(int i = 1; i < N; i++){
            queue.add(new Balloon(i+1, balloonLocation[i]));
        }

        //해당 풍선이 모두 터질때 까지 반복
        while(!queue.isEmpty()){
            //양수일 경우 인덱스가 큰 쪽으로
            if(moveValue > 0){
                //앞에 있는 요소를 모두 뒤로 보낸다.
                for(int i = 1; i < moveValue; i++){
                    queue.add(queue.poll());
                }
                //모두 뒤로 보냈다면
                Balloon next = queue.poll();
                moveValue = next.numValue; //이동값 갱신
                sb.append(next.index+" "); //터트린 풍선의 위치값 출력 목록에 저장
            }
            //음수일 경우 인덱스가 작은 쪽으로
            else{
                //뒤에 있는 요소들 모두 앞으로 보낸다.
                for(int i = 1; i < -moveValue; i++){
                    queue.addFirst(queue.pollLast());
                }
                //모두 뒤로 보냈다면
                Balloon next = queue.pollLast();
                moveValue = next.numValue;
                sb.append(next.index+" ");
            }

        }
        System.out.println(sb);
    }
}
//풍선의 인덱스와 숫자 값을 저장하는 클래스 Balloon
class Balloon{
    int index;
    int numValue;

    public Balloon(int index, int numValue) {
        this.index = index;
        this.numValue = numValue;
    }
}
        

결과

느낀 점

  • 양수, 음수 판별해서 방향을 바꾸는 것에 꽤 많이 애를 먹었다.
  • 그리고 한쪽으로만 나갈 수 있게끔 하려다가 돌파구를 찾지 못해서 다른 분들의 코드를 보고 양쪽으로 뽑는 것을 확인하여 그렇게 코드를 작성해서 겨우... 풀어냈다. (진짜... 요즘 알고리즘에 소홀히해서 그런지 쉽게 풀 수 있는 문제도 어렵게 느껴지는 것 같다...)

4개의 댓글

comment-user-thumbnail
2023년 8월 15일

큰 도움이 되었습니다, 감사합니다.

1개의 답글
comment-user-thumbnail
2023년 12월 4일

막혔는데 해결했습니다. 감사합니다!

1개의 답글