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());
}
}