Notice
Recent Posts
Link
- Today
- Total
hye-log
[백준]1244번 스위치 켜고 끄기(JAVA) 본문
0. 문제 링크
https://www.acmicpc.net/problem/1244
1244번: 스위치 켜고 끄기
첫째 줄에는 스위치 개수가 주어진다. 스위치 개수는 100 이하인 양의 정수이다. 둘째 줄에는 각 스위치의 상태가 주어진다. 켜져 있으면 1, 꺼져있으면 0이라고 표시하고 사이에 빈칸이 하나씩
www.acmicpc.net
1. 문제 설명
1) 1부터 연속적으로 번호가 붙어있는 스위치
2) 1 : 스위치가 켜져 있음 / 0 : 꺼져 있음
3) 남학생 : 자기가 받은 수의 배수인 스위치 번호의 상태를 바꿈
4) 여학생 : 자기가 받은 스위치를 중심으로 좌우가 대칭이면서 가장 많은 스위치를 포함하는 구간의 상태를 모두 바꿈
5) 스위치의 마지막 상태를 한 줄에 20개씩 출력
2) 입출력
// input
8
0 1 0 1 0 0 0 1
2
1 3
2 3
// output
1 0 0 0 1 1 0 1
3. 코드
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class b1244 {
static boolean[] arr;
public static void main(String[] args) throws FileNotFoundException {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt(); // 스위치의 개수
arr = new boolean[N]; // 스위치의 상태
for(int n = 0; n < N; n++) {
if(sc.nextInt() == 1) { // 1 : 켜져 있음, 0 : 꺼져 있음
arr[n] = true;
} else {
arr[n] = false;
}
}
int student = sc.nextInt(); // 학생 수
for(int s = 0; s < student; s++) {
int selection = sc.nextInt(); // 1(남) : 자기 배수 , 2 : 좌우대칭 구간
int value = sc.nextInt(); // 스위치 기준
switch(selection) {
case 1: // 자기 배수
for(int n = 0; n < N; n++) {
if((n+1) % value == 0) {
arr[n] = !arr[n]; // 스위치 조작
}
}
break;
case 2: // 좌우대칭 구간
symmetry(value-1, value-2, value);
break;
default:
break;
}
}
// 출력
StringBuilder sb = new StringBuilder();
for(int n = 0; n < N; n++) {
if((n > 0) && (n % 20 == 0)) {
sb.append("\n");
}
if(arr[n] == true) {
sb.append(1 + " ");
} else {
sb.append(0 + " ");
}
}
System.out.println(sb.toString());
}
private static void symmetry(int value, int left, int right) {
if(left >= 0 && left < arr.length && right >= 0 && right < arr.length) { // 범위 내
if(arr[left] == arr[right]) { // 대칭
if(left == 0 || right == arr.length-1) { // 마지막
for(int i = left; i <= right; i++) {
arr[i] = !arr[i]; // 스위치 조작
}
}
else{ // 마지막이 아니면 한번 더
symmetry(value, left-1, right+1);
}
} else { // 대칭이 아니면 여기까지 조작
for(int i = left+1; i <= right-1; i++) {
arr[i] = !arr[i]; // 스위치 조작
}
}
} else { // 범위 내에 없으면
arr[value] = !arr[value];
}
}
}
실행 결과
4. 회고
1) 스위치의 상태를 boolean으로 정의 -> ! 연산자를 활용
2) 여학생이 스위치 상태를 조작할 때 left, right 변수를 활용하여 대칭이면 대칭이 아닐 때까지 찾아서 조작
3) 20줄씩 출력하도록 % 연산자 이용하여 출력 형식 에러 해결
5. Github
https://github.com/iihye/Algorithm/blob/main/Baekjoon/b1244.java
728x90
'CodingTest > Baekjoon' 카테고리의 다른 글
[백준]12891번 DNA 비밀번호(JAVA) + 슬라이딩 윈도우 GIF (0) | 2023.08.06 |
---|---|
[백준]2961번 도영이가 만든 맛있는 음식(JAVA) (0) | 2023.08.06 |
[백준]11660번 구간 합 구하기 5(JAVA) (0) | 2023.08.06 |
[백준]11659번 구간 합 구하기 4(JAVA) (0) | 2023.08.06 |
[백준]15652번 N과 M(4)(JAVA) (0) | 2023.08.06 |
Comments