728x90

문제


https://www.acmicpc.net/problem/1018

 

1018번: 체스판 다시 칠하기

첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.

www.acmicpc.net

 

코드


//실버5 체스판 다시 칠하기
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\r\n");

//검정색이 맨처음 오는 경우
const blackFirst = [
  "BWBWBWBW",
  "WBWBWBWB",
  "BWBWBWBW",
  "WBWBWBWB",
  "BWBWBWBW",
  "WBWBWBWB",
  "BWBWBWBW",
  "WBWBWBWB",
];

//하얀색이 맨처음 오는 경우
const whiteFirst = [
  "WBWBWBWB",
  "BWBWBWBW",
  "WBWBWBWB",
  "BWBWBWBW",
  "WBWBWBWB",
  "BWBWBWBW",
  "WBWBWBWB",
  "BWBWBWBW",
];

const NM = input
  .shift()
  .split(" ")
  .map((i) => parseInt(i));
const N = NM.shift(); //세로길이(y축)
const M = NM.shift(); //가로길이(x축)
let arr = [];

function blackFirstPaint(y, x) {
  let count = 0; //몇 번이 바뀌는지 count할 변수

  //8x8행렬의 크기에 한해서 미리 선언해놓은 8x8 행렬과 같지 않은 부분은 count++
  for (let i = y; i < y + 8; i++) {
    for (let j = x; j < x + 8; j++) {
      if (input[i][j] !== blackFirst[i - y][j - x]) count++;
    }
  }
  return count;
}

function whiteFirstPaint(y, x) {
  let count = 0; //몇 번이 바뀌는지 count할 변수

  //8x8행렬의 크기에 한해서 미리 선언해놓은 8x8 행렬과 같지 않은 부분은 count++
  for (let i = y; i < y + 8; i++) {
    for (let j = x; j < x + 8; j++) {
      if (input[i][j] !== whiteFirst[i - y][j - x]) count++;
    }
  }
  return count;
}

//8x8모양이 체스판의 가로, 세로를 넘지않는 모든 경우에 대해
// i : y축(N), j : x축(M)
for (let i = 0; i + 7 < N; i++) {
  for (let j = 0; j + 7 < M; j++) {
    arr.push(blackFirstPaint(i, j)); //모든 경우의 수에 대해 count를 세본다
    arr.push(whiteFirstPaint(i, j));
  }
}
console.log(Math.min(...arr)); //모든 경우의 수 중에서 가장 작은 값을 return

 

후기


  • 정답이되는 체스판을 미리 선언해놓고 완전탐색을 통해 하나하나 비교하며 count++을 하였다
  • 다른 분들의 코드에 비해 그리 시간이나 메모리가 많이 잡아먹지는 않으나 좀 더 효율적인 방법이 있을 것 같긴하다

+ Recent posts