본문 바로가기
Algorithms/BOJ

[Java] 12927. 배수 스위치

by kyungsubbb 2021. 2. 27.

www.acmicpc.net/problem/12927

 

12927번: 배수 스위치

첫째 줄에 전구의 상태가 1번 전구부터 차례대로 주어진다. Y는 전구가 켜 있는 경우, N은 전구가 꺼져있는 경우이다. 전구의 개수는 1보다 크거나 같고 1,000보다 작거나 같은 자연수이다.

www.acmicpc.net

문제

강호는 전구 N개를 가지고 있다. 전구는 1번부터 N번까지 번호가 매겨져 있으며, 일렬로 놓여져 있다. 전구는 켜져있거나 꺼져있다.

강호는 모든 전구를 끄려고 한다. 강호는 전구를 켜고 끌 수 있는 스위치 N개를 가지고 있고, 스위치도 1번부터 N번까지 번호가 매겨져 있다. i번 스위치는 i의 배수 번호를 가지는 전구의 상태를 모두 반전시킨다.

현재 전구의 상태가 주어졌을 때, 모든 전구를 끄기 위해서 스위치를 몇 번 눌러야하는지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 전구의 상태가 1번 전구부터 차례대로 주어진다. Y는 전구가 켜 있는 경우, N은 전구가 꺼져있는 경우이다. 전구의 개수는 1보다 크거나 같고 1,000보다 작거나 같은 자연수이다.

출력

모든 전구를 끄기 위해서 스위치를 몇 번 눌러야 하는지 출력한다. 만약, 모든 전구를 끌 수 없다면 -1을 출력한다.


import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
	static boolean list[];
	static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
	public static void main(String[] args) throws Exception {
		String input = in.readLine();
		int count = 0;
		list = new boolean[input.length()+1];
		for (int i = 0; i < input.length(); i++) {
			if(input.charAt(i) == 'Y') list[i+1] = true;
			else list[i+1] = false;
		}
		for (int i = 1; i < list.length; i++) {
			if(checkLight()) {
				break;
			}
			if(list[i]) {
				toggleSwitch(i);
				count++;
			}
		}
		if(checkLight())
			System.out.println(count);
		else
			System.out.println(-1);
	}
	private static void toggleSwitch(int i) {
		int num = i;
		while(num < list.length) {
			list[num] = !list[num];
			num += i;
		}
	}
	private static boolean checkLight() {
		for (int i = 1; i < list.length; i++) {
			if(list[i]) return false;
		}
		return true;
	}

}

'Algorithms > BOJ' 카테고리의 다른 글

[Java] 2635. 수 이어가기  (0) 2021.03.01
[Java] 2628. 종이 자르기  (0) 2021.02.28
[Java] 14696. 딱지놀이  (0) 2021.02.26
[Java] 10163. 색종이  (0) 2021.02.25
[Java] 1904. 01타일  (0) 2021.02.24