백준 BaekJoon 15729번: 방탈출 [Java]

2021-01-18


문제

방탈출 게임을 하던 혜민이는 마지막 문제에 봉착했다. 단서는 다음과 같다.

  1. 앞에는 일렬로 놓여진 N개의 버튼이 모두 불이 꺼진 상태로 있다.
  2. 0 또는 1로 구성되어 있는 N자리 수가 적힌 쪽지가 있다.
  3. 0은 불이 꺼진 버튼, 1은 불이 켜진 버튼을 뜻한다.
  4. 불이 켜져 있는 버튼을 누르면 불이 꺼지고, 불이 꺼져 있는 버튼을 누르면 불이 켜진다.
  5. 버튼을 누르면 그 버튼 뿐만이 아닌 오른쪽 두 개의 버튼도 같이 눌린다. 

혜민이는 현재 모두 불이 꺼진 상태에서 버튼을 최소로 눌러서 쪽지와 똑같은 상태로 만들어야 한다는 것을 알아냈다! 혜민이를 도와줘서 방탈출 게임에 성공하자.

입력

첫째 줄에 N(1 ≤ N ≤ 1,000,000)가 주어지고 둘째 줄에는 쪽지에 적혀 있는 N자리의 수가 빈 칸을 사이에 두고 주어진다.

출력

눌러야하는 버튼의 최솟값을 출력한다.

힌트

다음과 같이 2개의 버튼을 눌러 쪽지에 적혀 있는 상태를 만들 수 있다.   

  • 모든 버튼이 꺼진 처음 상태 → 0 0 0 0 0 0 0
  • 세 번째 버튼을 누른 상태 → 0 0 1 1 1 0 0
  • 네 번째 버튼을 누른 상태 → 0 0 1 0 0 1 0

import java.util.Scanner;

public class TemplateA {
	public static void main(String[] args){
		Scanner scan = new Scanner (System.in);		
		int n = scan.nextInt();
		int [] start = new int [n];
		//초기 다꺼진 배열
		int [] arr = new int [n];
		
		for(int i = 0; i <n; i++) {
			arr[i] = scan.nextInt();
		}
		//주어진 배열 입력
		
		int count = 0;
		//충 누른 스위치 횟수를 저장할 변수
		int point = 0;
		//초기 배열과 주어진 배열의 다른 위치를 체크할 변수
		while(true) {
			boolean flag = false;
			for(int i = 0; i < n; i++) {
				if(arr[i] == start[i]){
					flag = true;
					//배열이 같을 경우 flag는 계속 true
				}else {
					flag = false;
					point = i;
					break;
					//배열이 다를경우 flag는 false과 되고 다른 지점
					//point에 저장
				}
			}	
			if(flag) {
				System.out.println(count);
				break;
			}	
			//flag 가 true이면 두 배열은 같기 때문에
			//총 버튼 누른 횟수 출력
			
			count++;
			//버튼을 누름
			for(int i = point; i < point + 3; i++) {
				if(i > n - 1) {
					break;
				}
				//단 버튼을 누를시 전체 배열의 크기는 초과하면 안되기 때문에
				//이와 같은 경우에는 break를 걸어줌
				start[i] = 1 - start[i];
				//0은 1로 1은 0으로 만들어주는 식
			}
		}
	}
}
	

 

출처링크 : www.acmicpc.net/problem/15729

 

15729번: 방탈출

첫째 줄에 N(1 ≤ N ≤ 1,000,000)가 주어지고 둘째 줄에는 쪽지에 적혀 있는 N자리의 수가 빈 칸을 사이에 두고 주어진다.

www.acmicpc.net