본문 바로가기

백준/JavaScript

[JS] 백준 1018번 - 체스판 다시 칠하기

728x90

 

 

드디어 브루트 포스 마지막 문제이다.

이제 내일부터는 본격적으로 알고리즘 공부를 시작해야겠다.

 

 

문제 1018번

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

 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net

 

으... 도저히 모르겠어서 다른 분의 풀이를 보고 공부했다.

일단 입력받은 N과 M을 변수에 넣는다. 그리고 비교할 white부터 시작하는 체스판과 black부터 시작하는 체스판도 준비해놓는다. 현재 입력받은 체스판을 board 배열에 넣고 비교할 영역을 선택하여 다시 칠해야하는 정사각형의 개수를 check해준다. 여기서 check는 함수로 따로 만들었다. 현재 체스판과 비교할 체스판들을 각각 비교하고, 다시 색칠해야하는 정사각형의 개수가 가장 적은 수를 result에 넣어준다. 만약 result가 더 작다면 result를 유지해주면 된다. 그렇게 알아낸 수를 출력해주면 되는 문제이다.

const readFileSyncAdress = process.platform === 'linux' ? '/dev/stdin':'./input.txt'
const input = require("fs").readFileSync(readFileSyncAdress).toString().split('\n');

let input2 = input.shift().split(' ');
let N = Number(input2.shift());
let M = Number(input2.shift());
let white = ['WBWBWBWB', 'BWBWBWBW', 'WBWBWBWB', 'BWBWBWBW', 'WBWBWBWB', 'BWBWBWBW', 'WBWBWBWB', 'BWBWBWBW'];
let black = ['BWBWBWBW', 'WBWBWBWB', 'BWBWBWBW', 'WBWBWBWB', 'BWBWBWBW', 'WBWBWBWB', 'BWBWBWBW', 'WBWBWBWB'];
let board = []; //현재 체스판
let result = 64;    //가장 많이 고쳐야할 때 체스판(8*8)

function check(x,y){
    let checkBlack = 0;
    let checkWhite = 0;
    for(let i=x;i<x+8;i++){
        for(let j=y;j<y+8;j++){
            if(board[i][j]!==black[i-x][j-y]){
                checkBlack++;
            }
            if(board[i][j]!==white[i-x][j-y]){
                checkWhite++;
            }
        }
    }
    let min=checkBlack<checkWhite?checkBlack:checkWhite;
    if(result>min){
        result = min;
    }
}

for (let i = 0; i < N; i++) {   //체스판에 현재 체스판을 넣어줌
  board[i] = input.shift().split('');
}

for (let i = 0; i <= N - 8; i++) {  // 8*8 영역을 선택해야하니 해당 크기에서 8을 빼줌
  for (let j = 0; j <= M - 8; j++) {
    check(i, j);
  }
}

console.log(result);

 

 

뭔가 알겠는데 좀 헷갈린다. 다음에 다시 한번 풀어봐야겠다.

728x90