차곡차곡

[BOJ/Java] 백준 1244번 - 스위치 켜고 끄기 본문

CS/Algorithm

[BOJ/Java] 백준 1244번 - 스위치 켜고 끄기

sohy 2023. 8. 1. 23:32

백준 #1244 스위치 켜고 끄기

 

1244번: 스위치 켜고 끄기

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

www.acmicpc.net

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		// 입력 받기 
		int n = Integer.parseInt(br.readLine());  // 스위치 개수
		int[] state = new int[n+1];  // 스위치 상태 (0은 사용 x)
		StringTokenizer st = new StringTokenizer(br.readLine());
		for (int i = 1; i < state.length; i++) {
			state[i] = Integer.parseInt(st.nextToken());
		}
		int stuNum = Integer.parseInt(br.readLine());  // 학생 수
		int[][] stuInfo = new int[stuNum][2];  // [성별, 받은 수]
		for (int i = 0; i < stuNum; i++) {
			st = new StringTokenizer(br.readLine());
			stuInfo[i][0] = Integer.parseInt(st.nextToken());
			stuInfo[i][1] = Integer.parseInt(st.nextToken());
			
		}
		
		
		// 풀이
		for (int i = 0; i < stuNum; i++) {
			if (stuInfo[i][0]  == 1) {  // 남학생 
				int num = stuInfo[i][1];  // 받은 수 
				while (num <= n) {
					state[num] = state[num] == 0 ? 1 : 0;
					num += stuInfo[i][1];
				}
			} else {  // 여학생 
				int num = stuInfo[i][1];  // 받은 수 
				int range = n - num < num - 1 ? n - num : num - 1;  // 대조할 수 있는 최대 거리
				int possibleRange = 0;
				for (int j = 1; j <= range; j++) {
					if (state[num-j] == state[num+j]) {
						possibleRange = j;
					} else {
						break;
					}
				}
				state[num] = state[num] == 0 ? 1 : 0;
				for (int j = 1; j <= possibleRange; j++) {
					state[num+j] = state[num+j] == 0 ? 1 : 0;
					state[num-j] = state[num-j] == 0 ? 1 : 0;
				}
				
			}
			
		}  // end of for
		
		// 출력 
		for (int i = 1; i < state.length; i++) {
			System.out.printf("%d ", state[i]);
			if (i % 20 == 0) {
				System.out.println();  // 한 줄에 스위치가 20개 이상 넘어가면 줄바꿈
			}
		}
		
	}  // end of main
}  // end of class

 

문제에서 주어진 조건 그대로 구현하면 된다. 여자 조건의 경우, 받은 수를 기준으로 대칭이 최대일 때까지 스위치를 바꾸게 되는데,

1. 먼저 비교할 수 있는 범위의 최댓값을 구하고, 2. 그 범위만큼 대칭을 비교하여 대칭인 최대 범위를 구한다. 3. 마지막으로 구한 범위만큼 스위치를 변경한다.

 

주의해야 할 것들

- 20개씩 출력

- 인덱스 주의

 

Comments