백준

BOJ[java]_2346 풍선 터뜨리기

양갱이요 2023. 2. 26. 21:44

백준 링크: https://www.acmicpc.net/problem/2346

필요 알고리즘 개념 : deque

import java.io.IOException;
import java.util.ArrayDeque;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws NumberFormatException, IOException {
        var scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        var deque = new ArrayDeque<int[]>(); // deque(양방향 큐)를 이용하여 회전을 구현함
        for (int i = 0; i < N; ++i) {
            int value = scanner.nextInt();
            int no = i + 1;
            deque.addLast(new int[] { no, value }); // 풍선 번호와 값을 큐에 등록
        }
        while (true) {
            // 큐의 선두 풍선을 터뜨림 (제거함)
            int[] a = deque.remove();
            int no = a[0], value = a[1];
            // 큐의 선두 항목을 제거하자 마자, 그 다음 항목이 한 칸 앞으로 와서 선두 항목이 되기 때문에
            // 양수 방향 이동은 1 적게 이동하면 된다
            if (value > 0) --value;
            System.out.print(no + (deque.size() > 0 ? " " : "\n"));    // 방금 꺼낸 풍선 번호를 출력함
            if (deque.size() == 0) break;    // 풍선을 다 꺼냈으면 종료
            for (int i = 0; i < Math.abs(value); ++i) // 이동 횟수 만큼 큐를 회전함
                if (value > 0)
                    deque.addLast(deque.removeFirst()); // 오른쪽 이동이면, 왼쪽으로 회전
                else
                    deque.addFirst(deque.removeLast());  // 왼쪽 이동이면, 오른쪽으로 회전
        }
    }

}