


문제 자체는 굉장히 쉬웠다 :D
그래서 그냥 구현문제 느낌으로 생각나는대로 구현하였다.
코드가 더러워보이긴 하지만 금방 성공 :D
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
private static int N;
private static int arr[]; // 각 스위치의 상태
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine()); //스위치 개수
arr = new int[N+1];
StringTokenizer stringTokenizer = new StringTokenizer(br.readLine());
for(int i=1;i<=N;i++){
arr[i] = Integer.parseInt(stringTokenizer.nextToken());
}
int M = Integer.parseInt(br.readLine()); // 학생의 수
int student[][] = new int[M][2];
String str;
for(int i=0;i<M;i++){
str = br.readLine();
student[i][0] = Integer.parseInt(str.split(" ")[0]); //성별 남1 여2
student[i][1] = Integer.parseInt(str.split(" ")[1]); //받은 수
if(student[i][0] == 1){
//남학생
for(int j=N;j>=student[i][1];j--){
if(j % student[i][1] == 0){
//배수면
trans(j);
}
}
} else{
//여학생
int start = student[i][1];
int end = student[i][1];
trans(student[i][1]);
while(start >= 2 && end <= N-1){
if(arr[start - 1] == arr[end + 1]){
trans(start - 1);
trans(end + 1);
start--;
end++;
} else{
break;
}
}
}
}
StringBuilder stringBuilder = new StringBuilder();
for(int i=1;i<=N;i++){
stringBuilder.append(arr[i]).append(" ");
if(i!=1 && i % 20 == 0){
stringBuilder.append("\n");
}
}
System.out.println(stringBuilder);
}
private static void trans(int num){ //스위치 상태 변환
if(arr[num] == 0){
arr[num] = 1;
} else{
arr[num] = 0;
}
}
}
하지만 코드가 너무 길어서 자바로 더 짧게 할 수 있나 궁금해졌다.
그래서 다른 사람 숏코딩 어떻게 했나 봤는데 비트연산...!!
^ XOR 비트연산을 사용해서 스위치 값이 1이면 0, 0이면 1로 결과가 나온다.
숏코딩은 대부분 비트연산을 사용하는 것 같다 :(