[백준 | Javascript] 1018

박기영·2022년 7월 3일
0

백준

목록 보기
76/127

브루트 포스. 4단계
1018번. 체스판 다시 칠하기

문제

1018번 문제 링크

solution

const fs = require('fs');
let input = fs.readFileSync('/dev/stdin').toString().split('\n');

// 체스판의 세로(N)와 가로(M) 길이
let NM = input.shift().split(' ');
let N = Number(NM.shift());
let M = Number(NM.shift());

// 미리 만들어둔 체스판
// 왼쪽 위가 W일 경우와 B일 경우로 나눠서 만들었다
let white = ['WBWBWBWB', 'BWBWBWBW', 'WBWBWBWB', 'BWBWBWBW', 'WBWBWBWB', 'BWBWBWBW', 'WBWBWBWB', 'BWBWBWBW']
let black = ['BWBWBWBW', 'WBWBWBWB', 'BWBWBWBW', 'WBWBWBWB', 'BWBWBWBW', 'WBWBWBWB', 'BWBWBWBW', 'WBWBWBWB']

// 현재 보드의 상태를 넣기 위한 빈 배열
let board = [];

// N번째 줄까지 현재 체스판의 상태 board 배열에 넣어줌
// 형태는 white, black 배열과 같음
for (let i = 0; i < N; i++) {
  board[i] = input.shift().split('');
}

// 전부 고쳐야할 때가 8*8 = 64개
let answer = 64;

// 8x8 영역을 선택
for (let i = 0; i <= N - 8; i++) {
  for (let j = 0; j <= M - 8; j++) {
    check(j, i);
  }
}

// 고쳐야할지 말지 판별
function check(x, y) {
  let checkWhite = 0;
  let checkBlack = 0;

  for (let i = y; i < y + 8; i++) {
    for (let j = x; j < x + 8; j++) {      
      if (board[i][j] !== white[i-y][j-x])
        checkWhite++;
      if (board[i][j] !== black[i-y][j-x])
        checkBlack++;
    }
  }

  // B로 시작될 경우와 W로 시작될 경우 각각에 대해 고치는 횟수를 계산한 후
  // 어떤 경우가 더 적은지를 판단
  let min = checkBlack < checkWhite ? checkBlack : checkWhite;
  
  // min을 계속해서 업데이트해서 더 작은 min이 되도록 해줌
  if (min < answer)
    answer = min;
}

console.log(answer);

해설

열심히 고민해보다가 결국 다른 분의 풀이를 보았다.
체스판을 전부 만들어두고 시작하는 것 외에는 내 로직과 비슷해서 가져와봤다.
내 방식으로 고쳐보려고 했으나, 입력부터 오류가 발생해서 그대로 코드를 가져왔다.
주석을 달아서 개인적인 이해를 해보려고 한다.
사실 answer 변수를 만들어야하는 이유는 잘 이해하지 못했다.
전부 틀렸을 때가 64개를 고치는 상황이라서 그 것을 의미하는 줄 알았는데,
60으로 넣고 돌려고 문제가 없었다...
테스트 케이스에 포함되지 않은 상황이라 그런걸까?

profile
나를 믿는 사람들을, 실망시키지 않도록

0개의 댓글