알고리즘

[백준, 자바, 2346번] 풍선 터뜨리기

hminor 2024. 11. 14. 19:44
반응형

풀이

  • 해당 문제를 푸는 방법은 다양하게 있을 듯하다.
  • 다만 나는 배열을 새롭게 계속 변형하는 것은 효율적이지 않다고 생각하여
  • 인덱스를 사용해서 해결하고자 함.
  • 다만 처음에 간과했던 부분은 이미 터뜨린 풍선을 지나갈 때
  • 카운팅을 해버려서 계속 오답으로 나왔음.
  • 그래서 해당 문제를 이후에 깨닫고 나서는
  • for문을 거쳐서 하나씩 이동하면서 해당 위치가 이미 터뜨린 풍선의 위치라면
  • while문을 거치게 하여 터뜨리지 않은 풍선을 찾으며 해결하고자 하여 해결

 

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

public class _2346 {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int N = sc.nextInt();
        int[] li = new int[N];
        boolean[] check = new boolean[N];
        for (int i=0; i<N; i++) li[i]=sc.nextInt();

        int now = 0;
        for (int i=0; i<N; i++) {
            check[now] = true;
            bw.write((now%N)+1+" ");

            if (i!=N-1) {
                int next = now;
                int x = li[next]>0?1:-1;

                for (int j=0; j<Math.abs(li[now]); j++) {
                    next = next+x>=0?(next+x)%N:next+x+N;

                    while (check[next]) {
                        next = next+x>=0?(next+x)%N:next+x+N;
                    }
                }
                now = next;
            }
        }
        bw.flush();
    }
}