[백준] 전구와 스위치 2138 java

오늘내일·2024년 7월 1일
0

이 문제는 접근방법이 도저히 떠오르지 않아서 아래 블로그를 참고했다.
https://sa11k.tistory.com/50
블로그를 보니 이 문제의 중요한 포인트는 i번째 전구의 최종상태는 i + 1번째 스위치가 결정한다는 것이다. 코드를 보면 알겠지만 이러한 이유로 인해 i - 1번째 전구의 상태를 비교하면서 i번째 스위치를 누를지 말지 결정한다.
또 블로그를 보면서 한가지 궁금했던 것이 왜 첫번째(0번 인덱스) 스위치를 누른 것과 누르지 않은 것을 별도로 확인하는 것이었다. 이유를 생각해보니 첫번째 스위치를 누르는 지 여부는 어떠한 전구의 최종상태도 결정지을 수 없기 때문에, 첫번째 스위치를 누르고 진행하는 것과, 누르지 않고 진행하는 것은 각각 독립적인 결과를 가져오기때문에 각각의 경우를 나누어 진행한다.

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

public class Main {
  // N개의 스위치, N개의 전구
  // 전국는 켜져 있거나 꺼져 있거나이다
  // i번 스위치를 누르면 i -1, i, i + 1 전구 상태가 바뀜
  // 현재 상태에서 만들고자 하는 상태로 스위치를 최소 몇번 눌러야 변경가능한가?
  // 0은 켜져있고, 1은 꺼져있다.
  static boolean[] origin, to, originSwitchFirst;
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    int n = Integer.parseInt(br.readLine());
    String original = br.readLine();
    String change = br.readLine();

    origin = new boolean[n];
    to = new boolean[n];
    for (int i = 0; i < n; i++) {
      if (original.charAt(i) == '0') {
        origin[i] = true;
      }

      if (change.charAt(i) == '0') {
        to[i] = true;
      }
    }

    int count = 0;
    originSwitchFirst = Arrays.copyOf(origin, n);
    int countSwitchFirst = 0;

    for (int i = 0; i < n; i++) {
      if (i == 0) {
        switching(i, originSwitchFirst);
        countSwitchFirst++;
      } else {
        if (origin[i - 1] != to[i - 1]) {
          switching(i, origin);
          count++;
        }

        if (originSwitchFirst[i - 1] != to[i - 1]) {
          switching(i, originSwitchFirst);
          countSwitchFirst++;
        }
      }

      if (Arrays.equals(origin, to) && Arrays.equals(originSwitchFirst, to)) {
        System.out.println(Math.min(count, countSwitchFirst));
        return;
      }

      if (Arrays.equals(origin, to)) {
        System.out.println(count);
        return;
      }

      if (Arrays.equals(originSwitchFirst, to)) {
        System.out.println(countSwitchFirst);
        return;
      }
    }

    System.out.println(-1);
  }

  private static void switching (int idx, boolean[] array) {
    for (int i = idx - 1; i <= idx + 1; i++) {
      if (i < 0 || i >= array.length) {
        continue;
      }
      array[i] = !array[i];
    }
  }

}
profile
다시 시작합니다.

0개의 댓글