본문 바로가기

알고리즘 문제풀이/백준

[BOJ][JAVA]1244 - 스위치 켜고 끄기

문제 출처 : https://www.acmicpc.net/problem/1244

 

1244번: 스위치 켜고 끄기

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

www.acmicpc.net

 

 

문제

 

 

 

설명

 

조건이 많지만 로직 자체는 복잡하지 않아서, 그 조건을 하나씩 구현하기만 하면 되는 문제였습니다.

다만 bit flip시킬 때마다 조건문을 반복적으로 쓰지 않고, 삼항 연산자만으로 간단하게 표현이 가능하다는 게 포인트였습니다.

 

 

코드

 

//기억할 것 : bit flip 으로 " ? : " 연산자 활용 가능!
import java.util.Scanner;

public class BOJ1244_light {

	
	public static void main(String[] args) {
		Scanner sc = new Scanner (System.in);
		int n = sc.nextInt();
		int[] lights = new int[n+1];
		for (int i = 1; i < lights.length; i++) { //스위치 번호는 1번부터 시작한다.
			lights[i]=sc.nextInt();
		}
		
		int student_num = sc.nextInt();
		
		for(int i=0; i<student_num; i++) {
			int gender = sc.nextInt();
			int num = sc.nextInt(); //학생이 받은 수
			
			if(gender==1) { //학생이 남자이면
				for (int j = 1; j < lights.length; j++) {
					if(j%num==0) { //배수이면
						lights[j] = lights[j]==0 ? 1 : 0; // bit flip : 삼항 연산자 활용!!!
					}
				}
			}
			else { // 학생이 여자이면
				lights[num] = lights[num] == 1 ? 0 : 1;
				int a=1;
				while(num-a>=1 && num+a<lights.length) { //num을 기준으로 한 대칭을 살핌
					if(lights[num-a]-lights[num+a]==0) {
						lights[num-a] = lights[num-a] == 1 ? 0 : 1;
						lights[num+a] = lights[num+a] == 1 ? 0 : 1;
						a++;
					}
					else
						break;
				}
				
			}
		}
		
		for (int i = 1; i < lights.length; i++) {
			if(i==21 || i==41 || i==61 || i==81)
				System.out.println();
			System.out.printf("%d ", lights[i]);
			
		}
		
	}

}