티스토리 뷰
반응형
// 1.
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
const [ N, M ] = input.shift().split(' ').map(mn => parseInt(mn));
// 2.
const origin_board = [];
input.forEach((line) => { origin_board.push(Array.from(line)); });
// 3.
const [ black_board_88, white_board_88 ] = (function() {
let black = '', white = '';
for(let i = 0;i<4;i++) {
black += 'BWBWBWBWWBWBWBWB';
white += 'WBWBWBWBBWBWBWBW';
}
return [ Array.from(black), Array.from(white) ];
})();
// 4.
function diff(some_string) {
let when_black_board = 0, when_white_board = 0;
let some_board = Array.from(some_string);
some_board.forEach((square, idx) => {
if(square !== black_board_88[idx]) when_black_board++;
if(square !== white_board_88[idx]) when_white_board++;
});
return [ when_black_board, when_white_board ];
}
// 5.
function make_board(n, m) {
const row = n + 8, col = m + 8;
let result = '';
for(let outer = n; outer < row; outer++) {
for(let inner = m;inner < col; inner++) {
result += origin_board[outer][inner];
}
}
return result;
}
// 6.
function check_all_cases(checker) {
const row = N - 8, col = M - 8;
let result = [];
for(let outer = 0; outer <= row; outer++) {
for(let inner = 0; inner <= col; inner++) {
let some_board = make_board(outer, inner);
result.push(...checker(some_board));
}
}
return result;
}
// 7.
console.log(
Math.min(...check_all_cases(diff))
);
- 입력 받은 값을 N과 M으로 초기화한다.
- 입력 받은 값을 토대로 가공하기 전의 체스판을 2차원 배열로 변환한다.
- 비교 대상이 될 체스 판을 두 개 초기화한다. 각각 검은 칸이 먼저 오는 체스 판과 흰 칸이 먼저 오는 체스 판이 된다.
- diff 함수는 전달 받은 문자열을 순회하며 3.에서 초기화한 체스 판과 비교한 후, 다시 칠해야 되는 칸의 개수를 배열로 반환한다.
- make_board 함수는 가공하기 전의 체스판을 index 기준으로 가공한 8 * 8 체스 판을 문자열화하여 반환한다.
- check_all_cases 함수는 가공하기 전의 체스 판을 순회하되, 최소한 8 * 8 체스 판을 만들 수 있는 인덱스에서만 순회한다.
(예를 들어, 예시 입력인 10 * 13 배열의 경우는 index 0, 0부터 2, 5까지만 순회하면 된다. 그 이상은 8 * 8 체스 판을 만들 수 없다.)
각 인덱스로부터 make_board를 통해 가공 후의 체스 판을 받고, 해당 체스 판을 체크한 결과는 result에 초기화하여 반환한다.
이 때, checker는 check_all_cases 함수에 전달되어야 할 함수이다. - 결과를 출력하기 위해 check_all_cases에 4.에서 만들어둔 diff 함수를 넘겨준다.
이에 따라 origin_board의 모든 가능한 인덱스를 순회하며 만든 체스 판과 diff 함수를 통해 다시 칠해야 되는 모든 경우를 반환 받고,
Math.min과 spread 연산자를 통해 최소값만을 출력한다.
결과
11560 KB / 212 ms
메모
- 코드가 너무 길다. 쓸데 없는 연산을 줄일 수 있을 것 같은데, 잘 떠오르질 않아 위와 같이 작성하였음.
'Dev. > coding test' 카테고리의 다른 글
[BaekJoon] 4344 평균은 넘겠지 (node.js) (0) | 2021.07.09 |
---|---|
[BaekJoon] 11047 동전 0 (node.js) (0) | 2021.07.09 |
[BaekJoon] 1620 나는야 포켓몬 마스터 이다솜 (node.js) (0) | 2021.07.08 |
[BaekJoon] 2292 벌집 (node.js) (0) | 2021.07.06 |
[BaekJoon] 15829 Hashing (node.js) (0) | 2021.07.05 |
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- AWS
- jQuery
- Database
- Git
- eureka
- etc
- Java
- JEST
- terraform
- javascript
- AWS IoT
- JPA
- pgloader
- IntelliJ
- Vault
- react
- Node.js
- mysql
- postgresql
- Docker
- 코딩테스트
- dev
- Spring Cloud Config
- spring boot
- Linux
- kotlin
- shell
- Gradle
- Puppeteer
- hashicorp
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함