남학생의 경우 주어진 숫자의 배수에 해당하는 인덱스의 상태값을 바꿔주고
여학생의 경우 크게 2가지를 체크해야했는데
1. 주어진 수의 좌우 인덱스를 left, right라고 할 때
이 두 변수가 가능한 범위에 있는지()
2. left,right 인덱스의 상태값이 같은지 다른지 확인하는데
같은 경우 left는 -1, right는 +1해서 다음 범위도 대칭인지 확인한다.
이때 아닌 경우 종료하고 바로 이전 인덱스를 기준으로 해당하는 범위의 상태값을 변환한다.
두 수간에 값을 불타입 변수처럼 상태가 변하게 하는 걸
switches[num] = 1-switches[num];
로 표현했다.
처음에는 배열 선언을 아예 boolean으로 선언하려고 했지만
출력값이 정수형태로 저장해놔야 편하기 때문에 int타입 배열로 선언하였다.
예제 입출력도 통과하고 정답이라고 생각한 코드를 제출했는데
ArrayIndexError가 발생했다. 이 코드에서 사용한 인덱스는
int[] switches
뿐이었다.
left,right값을 바꾸고 switches배열의 해당 인덱스값을 불러올 때
문제가 발생한다고 생각해서 left,right를 초기화하거나 값이 변한 경우
left,right가 범위를 벗어나는지를 확인해줘서 해결했다.
import java.io.*;
import java.util.*;
// 배운 거
// 0->1, 1->0 반전 주는 법 : 1-switches[j]
// 범위 벗어나는지 미리 확인 : if(left<1 | right>n)
public class _1244 {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// 남학생: 자기가 받은 수의 배수
// 여학생: 자기가 받은 수를 중심으로 대칭
int n = Integer.parseInt(br.readLine()); // 스위치 개수
StringTokenizer st = new StringTokenizer(br.readLine());
int[] switches = new int[n+1];
for(int i=1; i<=n; i++){
switches[i] = Integer.parseInt(st.nextToken());
}
int students = Integer.parseInt(br.readLine()); // 학생 수
for(int i=0; i<students; i++){
st = new StringTokenizer(br.readLine());
int gender = Integer.parseInt(st.nextToken()); // 1: 남학생, 2: 여학생
int num = Integer.parseInt(st.nextToken()); // 학생이 받은 수
// 남학생: 받은 수의 배수에 해당하는 숫자의 상태를 반전
if(gender==1){
for(int j=num; j<=n; j+=num){ // 배수만큼 증가
switches[j] = 1-switches[j]; // 0->1, 1->0
}
}
// 여학생: 받은 수의 대칭이 유지되는 최대의 범위만큼 상태를 반전
else if(gender==2){
int left = num-1;
int right = num+1;
// 범위를 벗어나면 받은 숫자만 반전
if(left<1 | right>n){
switches[num] = 1-switches[num];
}
// 좌우가 다른 경우
else if(switches[left]!=switches[right]){
switches[num] = 1-switches[num];
}
// 좌우가 같은 경우
else{
// 좌우 대칭이 유지될 때까지 탐색
while(switches[left]==switches[right]){
left--;
right++;
// 범위를 벗어나면 종료
if(left<1 | right>n){
break;
}
}
for(int j=left+1;j<=right-1;j++){
switches[j] = 1-switches[j];
}
}
}
}
for(int i=1; i<=n; i++){
bw.write(switches[i]+" ");
if(i%20==0){
bw.write("\n");
}
}
bw.flush();
bw.close();
br.close();
}
}