시리즈: 알고리즘 (32개 글)
- 자바로 알고리즘 풀기
- [Java] 백준 10431 - 줄 세우기
- [Java & Node.js] 백준 9935 - 문자열 폭발
- [Node.js] 백준 22866 - 탑 보기
- [Java] 백준 4485 - 녹색 옷 입은 애가 젤다지?
- [Node.js] 백준 1283 - 단축키 지정
- [Java & Node.js] 백준 14469 - 소가 길을 건너간 이유 3
- [Java] 백준 8979 - 올림픽
- [Node.js] 백준 22866 - 탑 보기
- [Java] 백준 7568 - 덩치
- [Java] 백준 1244 - 스위치 켜고 끄기
- [Node.js] 백준 19941 - 햄버거 분배
- [Node.js] 백준 1254 - 팰린드롬 만들기
- [Java] 백준 2589 - 보물섬
- [Java] 백준 2309 - 일곱 난쟁이
- [Java] 백준 1789 - 수들의 합
- [Java] 백준 1987 - 알파벳
- [Node.js] [Rust] 백준 24460 - 특별상이라도 받고 싶어
- [Node.js] 백준 7576 - 탑 보기
- [Rust] 백준 1047 - 울타리 (N^4 브루트포스 + 그리디)
- [Node.js] 백준 9657 - 돌게임3
- [Rust] 백준 4963 - 섬의 개수
- [Node.js] 프로그래머스 - 모의고사 / 실패율
- [Rust] 백준 2667 - 단지번호붙이기
- [Node.js] 프로그래머스 - 방문 길이
- [Node.js] 프로그래머스 - 괄호 회전하기
- [Rust] 백준 1002 - 터렛
- [Node.js] 프로그래머스 - 크레인 인형뽑기 게임
- [Node.js] 프로그래머스 - 기능개발
- [Rust] 백준 13717 - 포켓몬 GO
- [JavaScript] 백준 1092 - 배
- [Rust] 백준 25329 - 학생별 통화 요금 계산
백준 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; 이부분을 빼먹어서 틀렸다.
시작하는 지점도 바꿔주자!