4pace9ray

백준#1244 스위치 켜고 끄기 (JAVA) 본문

Solving a problem/BAEKJOON

백준#1244 스위치 켜고 끄기 (JAVA)

4pace9ray 2021. 8. 4. 00:46

https://www.acmicpc.net/problem/1244

 

1244번: 스위치 켜고 끄기

첫째 줄에는 스위치 개수가 주어진다. 스위치 개수는 100 이하인 양의 정수이다. 둘째 줄에는 각 스위치의 상태가 주어진다. 켜져 있으면 1, 꺼져있으면 0이라고 표시하고 사이에 빈칸이 하나씩

www.acmicpc.net

문제
1부터 연속적으로 번호가 붙어있는 스위치들이 있다. 스위치는 켜져 있거나 꺼져있는 상태이다. <그림 1>에 스위치 8개의 상태가 표시되어 있다. ‘1’은 스위치가 켜져 있음을, ‘0’은 꺼져 있음을 나타낸다. 그리고 학생 몇 명을 뽑아서, 학생들에게 1 이상이고 스위치 개수 이하인 자연수를 하나씩 나누어주었다. 학생들은 자신의 성별과 받은 수에 따라 아래와 같은 방식으로 스위치를 조작하게 된다.
남학생은 스위치 번호가 자기가 받은 수의 배수이면, 그 스위치의 상태를 바꾼다. 즉, 스위치가 켜져 있으면 끄고, 꺼져 있으면 켠다. <그림 1>과 같은 상태에서 남학생이 3을 받았다면, 이 학생은 <그림 2>와 같이 3번, 6번 스위치의 상태를 바꾼다.
여학생은 자기가 받은 수와 같은 번호가 붙은 스위치를 중심으로 좌우가 대칭이면서 가장 많은 스위치를 포함하는 구간을 찾아서, 그 구간에 속한 스위치의 상태를 모두 바꾼다. 이때 구간에 속한 스위치 개수는 항상 홀수가 된다.
예를 들어 <그림 2>에서 여학생이 3을 받았다면, 3번 스위치를 중심으로 2번, 4번 스위치의 상태가 같고 1번, 5번 스위치의 상태가 같으므로, <그림 3>과 같이 1번부터 5번까지 스위치의 상태를 모두 바꾼다. 만약 <그림 2>에서 여학생이 4를 받았다면, 3번, 5번 스위치의 상태가 서로 다르므로 4번 스위치의 상태만 바꾼다.
입력으로 스위치들의 처음 상태가 주어지고, 각 학생의 성별과 받은 수가 주어진다. 학생들은 입력되는 순서대로 자기의 성별과 받은 수에 따라 스위치의 상태를 바꾸었을 때, 스위치들의 마지막 상태를 출력하는 프로그램을 작성하시오.

남자/여자 조건에 따라 if문을 사용하여 풀이하였습니다.

남자일 때는 받은 번호의 배수인 스위치의 상태를 변경하였습니다.

여자일 때는 일단 주어진 스위치는 무조건 상태 변경을 하고, 이를 중심으로 양쪽 값이 같을 때 스위치의 상태를 변경하는 것을 스위치 개수의 절반만큼 반복하였습니다.

 

개인적으로 조건을 작성하는 것보다 스위치 상태를 변경하는 것이 더 어려웠습니다.. 

처음에는 막무가내로 if문을 사용하여 0이면 1로 변경,, 1이면 0으로 변경해줬는데 코드 길이가 너무 길어져 포기하였습니다. 이는 삼항 연산자로 해결하였습니다. 훨씬 간결해진 코드를 보고 뿌듯하였습니다. 하하ㅏㅏ

   * 삼항 연산자 ( 조건식 ? 참일 때 값 : 거짓일 때 값 )

 

import java.util.Arrays;
import java.util.Scanner;

//입력 int[]
// 0 1 0 1 0 0 0 1 -> nextInt() -> int[] 저장
//학생수 입력, 반복 -> 성별 숫자 입력
//남자(1)이면 받은 번호의 배수 스위치 상태 변경
//여자(2)이면 받은 번호 위치 중심으로 양쪽 상태 같으면 자기 포함, 양 옆 상태 변경
///출력 1~20개씩 한 줄에 출력. 스위치 상태 사이에 빈칸 하나씩 둔다.

public class BJ1244_스위치켜고끄기 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int ea = sc.nextInt(); // 스위치 개수
		int[] state = new int[ea]; // 스위치 상태

		for (int t = 0; t < ea; t++) {
			state[t] = sc.nextInt(); // 배열에 스위치 상태 저장
		}

		int student = sc.nextInt(); // 학생수 입력

		for (int t = 0; t < student; t++) { //주어진 학생수 만큼 반복
			int gender = sc.nextInt(); // 성별 입력
			int number = sc.nextInt(); // 주어진 숫자

			if (gender == 1) { // 남자
				for (int i = 0; i < ea; i++) {
					if ((i + 1) % number == 0) {
						state[i] = state[i] == 0 ? 1 : 0;
					}
				}
			} // 남자 끝

			else if (gender == 2) { // 여자
				state[number - 1] = state[number - 1] == 0 ? 1 : 0; // 주어진 숫자 스위치는 무조건 상태 변경

				for (int i = 1; i <= ea / 2; i++) { // 대칭
					if (number - i - 1 < 0 || number + i - 1 >= ea) // 범위 벗어날 때
						break;
					if (state[number - i - 1] == state[number + i - 1]) { // 양쪽 값이 같을 때
						state[number - i - 1] = state[number - i - 1] == 0 ? 1 : 0;
						state[number + i - 1] = state[number + i - 1] == 0 ? 1 : 0;
					} else
						break; // 같지 않을 때
				}
			} // 여자 끝
		}//학생수 반복 끝

		// 출력
		for (int i = 0; i < ea; i++) {
			System.out.print(state[i] + " ");
			if ((i + 1) % 20 == 0)
				System.out.println();
		}
	} // end of main
}