알고리즘/BeakJoon

백준 1244 스위치 켜고 끄기 Java

개발자 정지은 2022. 12. 16. 12:06

스위치 상태를 반전시키는데 배열은 0부터 시작하지만 스위치 번호는 1부터 시작하는 것에 주의하고

여학생은 스위치 번호를 중심으로 좌우 대칭이 맞아야만 바꿀 수 있는 조건을 세우는 것이 헷갈렸던 문제

여학생 스위치 번호를 중심으로 두 쪽으로 스위치가 나누어지는데 더 작은 쪽을 기준으로 반복을 돌리면 되는 것을 알기까지 오래 걸렸다

<<코드>>

package hw;

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

public class Main_1244 {
	
	/*
	 * 스위치 번호 1부터 연속적으로 붙어있음
	 * 1 -> 켜져있음
	 * 0 -> 까쟈있음
	 * 남학생 -> 스위치 번호의 배수 스위치 상태 바꿈
	 * 여학생 -> 스위치 번호를 중심으로 좌우 대칭 가장 많은 스위치 포함하는 구간 찾아서 바꿈(개수는 항상 홀수)
	 * 스위치의 마지막 상태를 출력
	 */
	
	static int N; //스위치개수
	static int [] arr; //스위치 상태 배열
	static int students; //학생수
	

	public static void main(String[] args) throws NumberFormatException, IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		
		N = Integer.parseInt(br.readLine());
		
		//스위치번호가 1부터 시작되기 때문에 맞춰주기
		arr = new int [N+1];
		//0번째 인덱스는 안 쓸거니까 아예 안 나오는 숫자로 초기화
		arr[0] = 3;
		
		//스위치 상태 입력받기
		st = new StringTokenizer(br.readLine());
		for(int i=1; i<N+1; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
		}
		
		students = Integer.parseInt(br.readLine());
		
		for(int i=0; i<students; i++) {
			st = new StringTokenizer(br.readLine());
			int sex = Integer.parseInt(st.nextToken());
			int switchNum = Integer.parseInt(st.nextToken());
			
			if(sex == 1) {
				changeMan(switchNum);
			}
			else {
				changeWoman(switchNum);
			}
		}
		
		
		//한 줄에 20개씩 출력
		for(int i=1; i<N+1; i++) {
			System.out.print(arr[i]+ " ");
			if(i % 20 == 0) {
				System.out.println();
			}
		}


	}
	
	public static void changeMan(int switchNum) {
		for(int i=1; i<N+1; i++) {
			//스위치 번호의 배수라면
			if(i % switchNum == 0) {
				if(arr[i] == 1) {
					arr[i] = 0;
				}
				else {
					arr[i] = 1;
				}
			}
		}
	}
	
	public static void changeWoman(int switchNum) {
		//일단 자기 자신부터 바꾸기
		if(arr[switchNum] == 1) {
			arr[switchNum] = 0;
		}
		else {
			arr[switchNum] = 1;
		}
		
		int size = Math.min(switchNum, N-switchNum+1);
		
		for(int i=1; i<size; i++) {
			//대칭이라면
			if(arr[switchNum-i] == arr[switchNum+i]) {
				arr[switchNum-i] = arr[switchNum-i] == 1 ? 0 : 1;
				arr[switchNum+i] = arr[switchNum+i] == 1 ? 0 : 1;
			}
			else break;
		}
	}


}