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

정은아·2024년 2월 12일
post-thumbnail

문제

내 풀이

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Scanner;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws Exception {

        // 1번 풍선을 터뜨리고, 안에 들어있는 차례로 터뜨리기

        // 큐를 받아온다.
        // 풍선 안에 있는 값을 알아야한다.
        // 풍선의 순서를 알아야한다.
        // 두 가지의 값을 큐에 넣어야 하므로 클래스를 새로 만든다.

        StringBuilder sb = new StringBuilder();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");

        int num = Integer.parseInt(st.nextToken());
        Deque<Balloon> deque = new ArrayDeque<>();
        
        // 한 줄 끝나서 StringTokenizer가 끝났으므로 새로 받아온다.
        st = new StringTokenizer(br.readLine(), " ");
        
        // for문을 돌려서 deque 값을 추가한다.
        for (int i = 1; i <= num; i++) {
            deque.add(new Balloon(i, Integer.parseInt(st.nextToken())));
        }
        
        // while문을 돌려서 deque가 비게되면 자동으로 종료하게 한다.
        while (!deque.isEmpty()) {
            // 변수를 새로 만들어서 첫번째 값을 poll하고 출력한다.
            Balloon first = deque.pollFirst();
            sb.append(first.location);
            sb.append(" ");
            
            // 만일 deque가 하나 남았을 때 위 코드가 실행되어서 출력된 뒤,
            // deque가 비어있으면 종료. 
            if (deque.isEmpty()){
                break;
            }
            
            // first.value가 양수이면 오른쪽으로 값을 넘긴다.
            if (first.value > 0) {
                for (int i = 1; i < first.value ; i++) {
                    deque.offerLast(deque.pollFirst());
                }
            }else{
                // first.value가 음수이면 왼쪽으로 값을 넘긴다.
                // first.value가 음수이므로 Math.abs로 감싸서 절대값으로 출력
                for (int i = 1; i <= Math.abs(first.value); i++) {
                    deque.offerFirst(deque.pollLast());
                }
            }
        }

        System.out.println(sb.toString());
    }
    // 디큐가 받아와야할 데이터가 2개 이므로 클래스를 새로 만든다.
    public static class Balloon {
        int location = 0;
        int value = 0;
        
        //생성자를 만든다.
        public Balloon(int location, int value) {
            this.location = location;
            this.value = value;
        }
    }
}

느낀점

문제 개어려워서 잔뜩 쫄아버림

profile
꾸준함의 가치를 믿는 개발자

0개의 댓글