[백준] 1244 스위치 켜고 끄기 (실버4)

AI·2025년 10월 10일

https://www.acmicpc.net/problem/1244

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    static int n, sN;
    static boolean[] s;
    static int[][] student;
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine());
        s = new boolean[n+1];
        for(int i=1;i<=n;i++){
            int state = Integer.parseInt(st.nextToken());
            if(state == 1) s[i] = true;
        }
        sN = Integer.parseInt(br.readLine());
        student = new int[sN][2];
        for(int i=0;i<sN;i++){
            st = new StringTokenizer(br.readLine());
            int g = Integer.parseInt(st.nextToken());
            int gn = Integer.parseInt(st.nextToken());
            student[i][0] = g; // gender
            student[i][1] = gn; // number

            // 남자는 받은 수의 배수 값을 현재 값의 반대로 만들기
            // 여자는 현재 자신의 수에서 양 옆으로 넓혀가면서 대칭인 거 전부 값 변경
//            System.out.println(g+", "+gn);
            if(g == 1){
                for(int j=gn;j<=n;j+=gn){
                    s[j] = !s[j];
                }
            } else if(g == 2){
                int index = gn;
                s[index] = !s[index];
                for(int j=1;index-j>0||index+j<=n;j++){
                    if(s[index+j] != s[index-j]) break;
                    else{
                        s[index+j] = !s[index+j];
                        s[index-j] = !s[index-j];
                    }
                }
            }
//            // debug
//            System.out.println(i);
//            for(int k=1;k<=n;k++){
//                if(s[k]) System.out.print(1+" ");
//                else System.out.print(0+" ");
//            }
        }

        for(int i=1;i<=n;i++){
            if(s[i]) System.out.print(1+" ");
            else System.out.print(0+" ");
        }

    }

}

=> java.lang.ArrayIndexOutOfBoundsException
index-j>0||index+j<=n -> &&로 수정

출력 형식 수정

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    static int n, sN;
    static boolean[] s;
    static int[][] student;
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine());
        s = new boolean[n+1];
        for(int i=1;i<=n;i++){
            int state = Integer.parseInt(st.nextToken());
            if(state == 1) s[i] = true;
        }
        sN = Integer.parseInt(br.readLine());
        student = new int[sN][2];
        for(int i=0;i<sN;i++){
            st = new StringTokenizer(br.readLine());
            int g = Integer.parseInt(st.nextToken());
            int gn = Integer.parseInt(st.nextToken());
            student[i][0] = g; // gender
            student[i][1] = gn; // number

            // 남자는 받은 수의 배수 값을 현재 값의 반대로 만들기
            // 여자는 현재 자신의 수에서 양 옆으로 넓혀가면서 대칭인 거 전부 값 변경
            if(g == 1){
                for(int j=gn;j<=n;j+=gn){
                    s[j] = !s[j];
                }
            } else if(g == 2){
                int index = gn;
                s[index] = !s[index];
                for(int j=1;index-j>0&&index+j<=n;j++){
                    if(s[index+j] != s[index-j]) break;
                    else{
                        s[index+j] = !s[index+j];
                        s[index-j] = !s[index-j];
                    }
                }
            }
        }

        StringBuilder sb = new StringBuilder();
        for (int i = 1; i <= n; i++) {
            sb.append(s[i] ? 1 : 0).append(" ");
            if (i % 20 == 0) {
                sb.append("\n");
            }
        }
        System.out.println(sb.toString().trim());

    }

}

0개의 댓글