[백준] 1018 체스판 다시 칠하기 자바스크립트

드엔트론프·2023년 3월 4일
1

알고리즘

목록 보기
4/5

반 년? 정도 전에 이 문제를 맞닥뜨리고 포기했었다.

고작(?) 실버 문제에 막혔을때, 처음에는 그럴 수 있지 하며 다음에 풀어봐야지! 하고 넘어갔다.
반 년이 지나고 다시 풀어보려했는데, 똑같이 막혔다. 근데 반년이 지난 지금 계속 모르겠다고 안풀면 내가 나 스스로한테 실망해서 다른 사람의 코드를 보며 계속 이해하려 했고, 이해할 수 있었다!

이해하기 어려웠던 부분은 여러 조건들을 어떻게 다 만족하지 ? 였는데, 차근차근 생각해보며 맞춰볼 수 있었다.

//전체코드
let fs = require("fs");
let input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');

let [size, ...arr] = input;
let [row, col] = size.split(" ");
arr = arr.map((i) => i.split(""));
const answer = [];

//하얀색이 먼저 시작하는 판
const white = [
  "WBWBWBWB",
  "BWBWBWBW",
  "WBWBWBWB",
  "BWBWBWBW",
  "WBWBWBWB",
  "BWBWBWBW",
  "WBWBWBWB",
  "BWBWBWBW",
];

//검은색이 먼저 시작하는 판
const black = [
  "BWBWBWBW",
  "WBWBWBWB",
  "BWBWBWBW",
  "WBWBWBWB",
  "BWBWBWBW",
  "WBWBWBWB",
  "BWBWBWBW",
  "WBWBWBWB",
];

//하얀색이 먼저 시작하는 판과 비교하여 다르다면 count
function whiteFirst(x, y) {
  let count = 0;
  for (let i = 0; i < 8; i++) {
    for (let j = 0; j < 8; j++) {
      if (arr[i + x][j + y] !== white[i][j]) count++;
    }
  }
  return count;
}

//검은색이 먼저 시작하는 판과 비교하여 다르다면 count
function blackFirst(x, y) {
  let count = 0;
  for (let i = 0; i < 8; i++) {
    for (let j = 0; j < 8; j++) {
      if (arr[i + x][j + y] !== black[i][j]) count++;
    }
  }
  return count;
}

//전체 판을 움직이는 형태로 작성했기에, -7을 해줌으로써 전체 판을 벗어나지 않게 해준다.
for (let j = 0; j < row - 7; j++) {
  for (let k = 0; k < col - 7; k++) {
    answer.push(whiteFirst(j, k));
    answer.push(blackFirst(j, k));
  }
}
console.log(Math.min(...answer));
profile
왜? 를 깊게 고민하고 해결하는 사람이 되고 싶은 개발자

0개의 댓글