-
[백준] 1244번: 스위치 켜고 끄기PS/Java 2021. 3. 9.
1부터 연속적으로 번호가 붙어있는 스위치들이 있다. 스위치는 켜져 있거나 꺼져있는 상태이다. <그림 1>에 스위치 8개의 상태가 표시되어 있다. ‘1’은 스위치가 켜져 있음을, ‘0’은 꺼져 있음을 나타낸다. 그리고 학생 몇 명을 뽑아서, 학생들에게 1 이상이고 스위치 개수 이하인 자연수를 하나씩 나누어주었다. 학생들은 자신의 성별과 받은 수에 따라 아래와 같은 방식으로 스위치를 조작하게 된다.
스위치 번호 ① ② ③ ④ ⑤ ⑥ ⑦ ⑧
스위치 상태 0 1 0 1 0 0 0 1
<그림 1>남학생은 스위치 번호가 자기가 받은 수의 배수이면, 그 스위치의 상태를 바꾼다. 즉, 스위치가 켜져 있으면 끄고, 꺼져 있으면 켠다. <그림 1>과 같은 상태에서 남학생이 3을 받았다면, 이 학생은 <그림 2>와 같이 3번, 6번 스위치의 상태를 바꾼다.
스위치 번호 ① ② ③ ④ ⑤ ⑥ ⑦ ⑧
스위치 상태 0 1 1 1 0 1 0 1
<그림 2>여학생은 자기가 받은 수와 같은 번호가 붙은 스위치를 중심으로 좌우가 대칭이면서 가장 많은 스위치를 포함하는 구간을 찾아서, 그 구간에 속한 스위치의 상태를 모두 바꾼다. 이때 구간에 속한 스위치 개수는 항상 홀수가 된다.
예를 들어 <그림 2>에서 여학생이 3을 받았다면, 3번 스위치를 중심으로 2번, 4번 스위치의 상태가 같고 1번, 5번 스위치의 상태가 같으므로, <그림 3>과 같이 1번부터 5번까지 스위치의 상태를 모두 바꾼다. 만약 <그림 2>에서 여학생이 4를 받았다면, 3번, 5번 스위치의 상태가 서로 다르므로 4번 스위치의 상태만 바꾼다.
스위치 번호 ① ② ③ ④ ⑤ ⑥ ⑦ ⑧
스위치 상태 1 0 0 0 1 1 0 1
<그림 3>입력으로 스위치들의 처음 상태가 주어지고, 각 학생의 성별과 받은 수가 주어진다. 학생들은 입력되는 순서대로 자기의 성별과 받은 수에 따라 스위치의 상태를 바꾸었을 때, 스위치들의 마지막 상태를 출력하는 프로그램을 작성하시오.
[주의사항]
출력은 한 줄에 최대 20개씩 출력한다.
import java.util.Scanner; public class Baekjoon1244 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); boolean[] arr = new boolean[n]; for(int i = 0; i < n; i++) { int p = scanner.nextInt(); if(p == 1) { arr[i] = true; } } int num = scanner.nextInt(); for(int i = 0; i < num; i++) { int p = scanner.nextInt(); int q = scanner.nextInt(); int r = q - 1; arr[r] = !arr[r]; if(p == 1) { // 남학생의 경우 if(q <= n / 2) { int m = 2; while(true) { if(q * m > n) { break; } arr[q * m - 1] = !arr[q * m - 1]; m++; } } } else { // 여학생의 경우 int j = 1; while(true) { if(r - j < 0 || r + j >= n) { break; } if(arr[r - j] == arr[r + j]) { arr[r - j] = !arr[r - j]; arr[r + j] = !arr[r + j]; j++; } else { break; } } } } StringBuilder sb = new StringBuilder(); for(int i = 1; i <= n; i++) { if(arr[i-1]) { sb.append("1 "); } else { sb.append("0 "); } if(i % 20 == 0) sb.append("\n"); } String result = sb.substring(0, sb.length() - 1); System.out.println(result); } }
'PS > Java' 카테고리의 다른 글
[백준] 16926번: 배열 돌리기 (0) 2021.03.09 [백준] 17478번: 재귀함수가 뭔가요? (0) 2021.03.09 [백준] 2961번: 도영이가 만든 맛있는 음식 (0) 2021.03.09 [SWEA] 6808. 규영이와 인영이의 카드게임 (0) 2021.03.09 [백준] 2563번: 색종이 (0) 2021.03.09