2021-01-18
문제
방탈출 게임을 하던 혜민이는 마지막 문제에 봉착했다. 단서는 다음과 같다.
- 앞에는 일렬로 놓여진 N개의 버튼이 모두 불이 꺼진 상태로 있다.
- 0 또는 1로 구성되어 있는 N자리 수가 적힌 쪽지가 있다.
- 0은 불이 꺼진 버튼, 1은 불이 켜진 버튼을 뜻한다.
- 불이 켜져 있는 버튼을 누르면 불이 꺼지고, 불이 꺼져 있는 버튼을 누르면 불이 켜진다.
- 버튼을 누르면 그 버튼 뿐만이 아닌 오른쪽 두 개의 버튼도 같이 눌린다.
혜민이는 현재 모두 불이 꺼진 상태에서 버튼을 최소로 눌러서 쪽지와 똑같은 상태로 만들어야 한다는 것을 알아냈다! 혜민이를 도와줘서 방탈출 게임에 성공하자.
입력
첫째 줄에 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