[Algorithm - Baekjoon] 2138번 전구와 스위치

nunu·2023년 12월 17일
0

Algorithm

목록 보기
101/142

문제

N개의 스위치와 N개의 전구가 있다. 각각의 전구는 켜져 있는 상태와 꺼져 있는 상태 중 하나의 상태를 가진다. i(1 < i < N)번 스위치를 누르면 i-1, i, i+1의 세 개의 전구의 상태가 바뀐다. 즉, 꺼져 있는 전구는 켜지고, 켜져 있는 전구는 꺼지게 된다. 1번 스위치를 눌렀을 경우에는 1, 2번 전구의 상태가 바뀌고, N번 스위치를 눌렀을 경우에는 N-1, N번 전구의 상태가 바뀐다.

N개의 전구들의 현재 상태와 우리가 만들고자 하는 상태가 주어졌을 때, 그 상태를 만들기 위해 스위치를 최소 몇 번 누르면 되는지 알아내는 프로그램을 작성하시오.

입력

첫째 줄에 자연수 N(2 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 전구들의 현재 상태를 나타내는 숫자 N개가 공백 없이 주어진다. 그 다음 줄에는 우리가 만들고자 하는 전구들의 상태를 나타내는 숫자 N개가 공백 없이 주어진다. 0은 켜져 있는 상태, 1은 꺼져 있는 상태를 의미한다.

출력

첫째 줄에 답을 출력한다. 불가능한 경우에는 -1을 출력한다.

예제1 - 입력

3
000
010

예제1 - 출력

3

제출코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());
        int[] now1 = new int[n];

        char[] temp = br.readLine().toCharArray();
        for (int j = 0; j < n; j++) {
            now1[j] = temp[j] - '0';
        }

        int[] target = new int[n];
        temp = br.readLine().toCharArray();
        for (int j = 0; j < n; j++) {
            target[j] = temp[j] - '0';
        }

        int[] now2 = Arrays.copyOf(now1, n);
        now2[0] = 1 - now2[0];
        now2[1] = 1 - now2[1];
        int answer1 = solution(n, now1, target);
        int answer2 = solution(n, now2, target);
        if (answer2 != -1)
            answer2++;

        if (answer1 == -1) {
            System.out.println(answer2);
        }
        else if (answer2 == -1) {
            System.out.println(answer1);
        }
        else {
            System.out.println(Math.min(answer1, answer2));
        }

    }
    static int solution(int n, int[] arrA, int[] arrB) {
        int answer = 0;
        for (int i = 0; i + 1 < n; i++) {
            if (arrA[i] != arrB[i]) {
                answer++;
                arrA[i] = 1 - arrA[i];
                arrA[i + 1] = 1 - arrA[i + 1];
                if (i + 2 < n)
                    arrA[i + 2] = 1 - arrA[i + 2];
            }
        }
        if (check(arrA, arrB))
            return answer;
        else return -1;
    }
    static boolean check(int[] arrA, int[] arrB) {
        for (int i = 0; i < arrA.length; i++) {
            if (arrA[i] != arrB[i])
                return false;
        }
        return true;
    }
}
profile
Hello, I'm nunu

0개의 댓글