백준 1244 - 스위치 켜고 끄기
문제 이해
- 스위치 상태 : 1 & 0
- 남학생 : 자신의 배수에 해당하는 스위치 전환
- 여학생 : 대칭 구간에 대해서 스위치 전환
- 1번 스위치에서 시작하여 마지막 스위치까지 한 줄에 20개씩 출력
접근
- 스위치 번호는 1부터 시작한다. 따라서 N + 1 개의 배열 선언
- student 클래스 활용
gender
와number
가짐 - 남학생 / 여학생 메서드 분리
- 스위치 상태 변경 = XOR 연산
Student 클래스
static class Student {
int gender; // 1: 남학생, 2: 여학생
int number; // 받은 스위치 번호
public Student(int gender, int number) {
this.gender = gender;
this.number = number;
}
}
남학생 메서드
// 자기가 받은 수의 배수에 해당하는 스위치 상태 변경
static void male(int number) {
for (int i = 1; i * number <= switchN; i++) {
switchs[i * number ] ^= 1;
}
}
여학생 메서드
// 자기가 받은 수를 중심으로 대칭을 이루는 가장 큰 구간을 찾아서 상태 반전
static void female(int number) {
switchs[number] ^= 1;
for (int i = 1;;i++) {
int left = number - i;
int right = number + i;
if (left < 1 || right > switchN || switchs[left] != switchs[right]) {
break;
}
switchs[left] ^= 1;
switchs[right] ^= 1;
}
}
전체 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int[] switchs;
static int switchN;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
switchN = Integer.parseInt(br.readLine());
switchs = new int[switchN + 1];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 1; i <= switchN; i++) {
int curSwitch = Integer.parseInt(st.nextToken());
switchs[i] = curSwitch;
}
// 학생 수
int studentN = Integer.parseInt(br.readLine());
Student[] students = new Student[studentN];
for (int i = 0; i < studentN; i++) {
st = new StringTokenizer(br.readLine());
int gender = Integer.parseInt(st.nextToken());
int number = Integer.parseInt(st.nextToken());
students[i] = new Student(gender, number);
}
for (Student s : students) {
if (s.gender == 1) {
male(s.number);
} else {
female(s.number);
}
}
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= switchN; i++) {
sb.append(switchs[i]);
if (i % 20 == 0) {
sb.append('\n');
} else if (i < switchN) {
sb.append(" ");
}
}
System.out.println(sb);
br.close();
}
static class Student {
int gender;
int number;
public Student(int gender, int number) {
this.gender = gender;
this.number = number;
}
}
// 자기가 받은 수의 배수에 해당하는 스위치 상태 변경
static void male(int number) {
for (int i = 1; i * number <= switchN; i++) {
switchs[i * number ] ^= 1;
}
}
// 자기가 받은 수를 중심으로 대칭을 이루는 가장 큰 구간을 찾아서 상태 반전
static void female(int number) {
switchs[number] ^= 1;
for (int i = 1;;i++) {
int left = number - i;
int right = number + i;
if (left < 1 || right > switchN || switchs[left] != switchs[right]) {
break;
}
switchs[left] ^= 1;
switchs[right] ^= 1;
}
}
}
마무리하며
여학생 메서드에
switchs[number] ^= 1;
이부분을 빼먹어서 틀렸다.
시작하는 지점도 바꿔주자!