코딩문제풀이/Baekjoon
[Java] 백준 2138번 : 전구와 스위치
코딩하는 포메라니안
2023. 3. 20. 12:33
문제
https://www.acmicpc.net/problem/2138
2138번: 전구와 스위치
N개의 스위치와 N개의 전구가 있다. 각각의 전구는 켜져 있는 상태와 꺼져 있는 상태 중 하나의 상태를 가진다. i(1 < i < N)번 스위치를 누르면 i-1, i, i+1의 세 개의 전구의 상태가 바뀐다. 즉, 꺼져
www.acmicpc.net
풀이 과정
첫 번째 스위치의 상태가 정해지면, 나머지 전구를 꺼야하는지가 결정된다. 따라서 첫 번째 스위치를 눌렀을 때와 안 눌렀을 때 2가지 경우에 대해 최솟값을 반환한다.
각 스위치를 누를지 말지 결정하는 기준은 자기 앞의 값이 목표 상태와 같은지 보고 결정하면 된다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
static int N;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
char[] now1 = br.readLine().toCharArray();
char[] now2 = Arrays.copyOf(now1, N);
char[] goal = br.readLine().toCharArray();
//1번 스위치 안 눌렀을 때 vs 눌렀을 때
now2[0] = (now2[0] == '0') ? '1' : '0';
now2[1] = (now2[1] == '0') ? '1' : '0';
int result = Math.min(switching(now1, goal, 0), switching(now2, goal, 1));
System.out.println(result == Integer.MAX_VALUE ? -1 : result);
}
public static int switching(char[] now, char[] goal, int res){
for(int i=1; i<N-1; i++){
if(now[i-1] != goal[i-1]){
res++;
for(int j=-1; j<=1; j++){
now[i+j] = (now[i+j] == '0') ? '1' : '0';
}
}
}
if(now[N-2] != goal[N-2]){
res++;
now[N-2] = (now[N-2] == '0') ? '1' : '0';
now[N-1] = (now[N-1] == '0') ? '1' : '0';
}
if(now[N-1] == goal[N-1]){
return res;
}
else{
return Integer.MAX_VALUE;
}
}
}