[프로그래머스] 2차원 동전 뒤집기

Chobby·2024년 3월 3일
1

Programmers

목록 보기
341/345

😀요점

beginning을 뒤집어서 target을 만들 때 나오는 경우의 수는 총 4가지 입니다.

  1. 각 행의 첫 번째 원소가 서로 다르면 행을 먼저 뒤집는다. 이후 각 열의 첫 번째 원소가 다르면 열을 뒤집는다.
  2. 각 행의 첫 번째 원소가 서로 같으면 행을 먼저 뒤집는다. 이후 각 열의 첫 번째 원소가 다르면 열을 뒤집는다.
  3. 각 열의 첫 번째 원소가 서로 다르면 열을 먼저 뒤집는다. 이후 각 행의 첫 번째 원소가 다르면 행을 뒤집는다.
  4. 각 열의 첫 번째 원소가 서로 같으면 열을 먼저 뒤집는다. 이후 각 행의 첫 번째 원소가 다르면 행을 뒤집는다.

위의 4가지 방법은 모두 target으로 향하게 되는데 이 중 최소값을 반환하면 됩니다.

하나라도 target이 안 되면 4가지 모두 안 되고 이때는 -1을 반환해줍니다.

최진균님의 게시물을 참고하면 더욱 잘 정리되어있다.

😎풀이

function solution(beginning, target) {
    const N = beginning.length;
    const M = beginning[0].length;

    let ans = Infinity;
    
    // 경우의 수 4가지
    /*
        1. 각 행의 첫 번째 원소가 서로 다르면 행을 먼저 뒤집는다. 이후 각 열의 첫 번째 원소가 다르면 열을 뒤집는다.
        2. 각 행의 첫 번째 원소가 서로 같으면 행을 먼저 뒤집는다. 이후 각 열의 첫 번째 원소가 다르면 열을 뒤집는다.
        3. 각 열의 첫 번째 원소가 서로 다르면 열을 먼저 뒤집는다. 이후 각 행의 첫 번째 원소가 다르면 행을 뒤집는다.
        4. 각 열의 첫 번째 원소가 서로 같으면 열을 먼저 뒤집는다. 이후 각 행의 첫 번째 원소가 다르면 행을 뒤집는다.
    */
    for (let k = 0; k < 4; k++) {
        let copy = JSON.parse(JSON.stringify(beginning));
        let cnt = 0;

        for (let i = 0; i < N; i++) {
            if ((k < 2 && copy[i][0] != target[i][0]) || (k >= 2 && copy[i][0] == target[i][0])) {
                cnt++;
                for (let j = 0; j < M; j++) {
                    copy[i][j] = 1 ^ copy[i][j];
                }
            }
        }

        for (let j = 0; j < M; j++) {
            if ((k % 2 == 0 && copy[0][j] != target[0][j]) || (k % 2 == 1 && copy[0][j] == target[0][j])) {
                cnt++;
                for (let i = 0; i < N; i++) {
                    copy[i][j] = 1 ^ copy[i][j];
                }
            }
        }

        if (JSON.stringify(copy) == JSON.stringify(target)) {
            ans = Math.min(ans, cnt);
        }
    }

    return ans == Infinity ? -1 : ans;
}
profile
내 지식을 공유할 수 있는 대담함

0개의 댓글