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++을 하였다
- 다른 분들의 코드에 비해 그리 시간이나 메모리가 많이 잡아먹지는 않으나 좀 더 효율적인 방법이 있을 것 같긴하다
'알고리즘 > BOJ' 카테고리의 다른 글
[백준] 뒤집힌 덧셈 / JavaScript / node.js (0) | 2022.02.08 |
---|---|
[백준] 영화감독 숌 / JavaScript / node.js (0) | 2022.02.07 |
[백준] 문자열 분석 / JavaScript / node.js (0) | 2022.02.05 |
[백준] 좋다 / JavaScript / node.js (0) | 2022.02.05 |
[백준] 숫자 카드 / JavaScript / node.js (0) | 2022.02.04 |