beginning을 뒤집어서 target을 만들 때 나오는 경우의 수는 총 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;
}