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



풀이
나만 그런지 몰라도 글이 매우 어렵게 느껴졌다
정리해보면 주어진 스위치가 있는데
남학생 -> 스위치 번호가 받은 수의 배수인 것만 상태 바꿈
여학생 -> 받은 수를 중심으로 대칭 탐색 -> 대칭인 스위치 상태가 같아야 함
코드를 보면 이해가 갈 것이다
배열 인덱스가 1부터 시작해서 처음엔 배열 범위 밖으로 나가서 런타임 에러가 났었다
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N;
static int[] sch;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
// 스위치 개수 입력
N = Integer.parseInt(br.readLine());
sch = new int[N + 1];
// 스위치 상태 입력
st = new StringTokenizer(br.readLine());
for (int i = 1; i <= N; i++) {
sch[i] = Integer.parseInt(st.nextToken());
}
// 사람 수 입력
int M = Integer.parseInt(br.readLine());
for (int i = 0; i < M; i++) {
// 성별, 스위치 번호 입력
st = new StringTokenizer(br.readLine());
int s = Integer.parseInt(st.nextToken());
int num = Integer.parseInt(st.nextToken());
// 조건에 맞는 스위치 상태 바꾸는 메서드
task(s, num);
}
for (int i = 1; i <= N; i++) {
sb.append(sch[i] + " ");
if (i % 20 == 0) {
sb.append("\n");
}
}
System.out.println(sb);
}
static void task(int s, int num) {
// 남학생이라면
if (s == 1) {
// num의 배수만 스위치 상태를 바꿔줌
for (int i = num; i <= N; i++) {
if (i % num == 0) {
change(i);
}
}
} else {
// num의 전과 후를 설정
int i = num - 1;
int j = num + 1;
// 고른 번호의 스위치는 무조건 바뀌어야 함
change(num);
while (true) {
// i, j가 배열 범위를 넘어가면 break
if (i <= 0 || j > N + 1) {
break;
}
// 대칭으로 상태가 같다면 상태를 바꿔줌
if (sch[i] == sch[j]) {
change(i);
change(j);
} else {
// 대칭 스위치 상태가 다르면 break
break;
}
// i, j 갱신
i--;
j++;
}
}
}
// 스위치 상태 바꾸는 메서드
// 1 -> 0 / 0 -> 1
private static void change(int num) {
if (sch[num] == 1) {
sch[num] = 0;
} else {
sch[num] = 1;
}
}
}
결과
