hye-log

[백준]1244번 스위치 켜고 끄기(JAVA) 본문

CodingTest/Baekjoon

[백준]1244번 스위치 켜고 끄기(JAVA)

iihye_ 2023. 8. 6. 01:47

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
Comments