문제
풀이
검은색이 이겼을 경우에는 1을, 흰색이 이겼을 경우에는 2를, 아직 승부가 결정되지 않았을 경우에는 0을 출력한다. 또한, 검은색 또는 흰색이 이겼을 경우에는 연속된 다섯 개의 바둑알 중에서 가장 왼쪽에 있는 바둑알의 좌표를 출력한다.
- 오목판의 모든 인덱스를 탐색하며 1 또는 2인 위치를 찾는다.
- 해당 위치를 기준으로 아래 방향, 오른쪽 방향, 오른쪽 위 방향, 오른쪽 아래 방향으로 각각 탐색을 수행한다.
- 연속된 바둑알이 5개를 초과하는지 확인하고 이 경우 예외 처리를 수행한다.
- 첫 번째 바둑알 이전 위치와 마지막 바둑알 다음 위치를 확인한다.
소스 코드
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
const input = require("fs")
.readFileSync(filePath)
.toString()
.trim()
.split("\n");
const board = Array.from({ length: 19 }, () => Array(19).fill(null));
const dir = [
[1, 0],
[0, 1],
[1, 1],
[-1, 1],
];
for (let i = 0; i < 19; i++) {
const temp = input[i].split(" ").map((el) => +el);
for (let j = 0; j < 19; j++) {
board[i][j] = temp[j];
}
}
for (let i = 0; i < 19; i++) {
for (let j = 0; j < 19; j++) {
if (board[i][j] !== 0) {
if (search(i, j)) {
console.log(board[i][j]);
console.log(i + 1, j + 1);
return;
}
}
}
}
console.log(0);
function search(x, y) {
const target = board[x][y];
for (let k = 0; k < 4; k++) {
let cnt = 1;
let nx = x + dir[k][0];
let ny = y + dir[k][1];
while (
nx >= 0 &&
nx < 19 &&
ny >= 0 &&
ny < 19 &&
board[nx][ny] === target
) {
cnt += 1;
if (cnt === 5) {
const bx = x - dir[k][0];
const by = y - dir[k][1];
const fx = nx + dir[k][0];
const fy = ny + dir[k][1];
if (
bx >= 0 &&
bx < 19 &&
by >= 0 &&
by < 19 &&
board[bx][by] === target
)
break;
if (
fx >= 0 &&
fx < 19 &&
fy >= 0 &&
fy < 19 &&
board[fx][fy] === target
)
break;
return true;
}
nx += dir[k][0];
ny += dir[k][1];
}
}
return false;
}
'알고리즘 연습' 카테고리의 다른 글
[알고리즘 연습] 백준 21278 (호석이 두 마리 치킨, 자바스크립트) (0) | 2023.05.22 |
---|---|
[알고리즘 연습] 백준 17276 (배열 돌리기, 자바스크립트) (0) | 2023.05.22 |
[알고리즘 연습] 백준 15686 (치킨 배달, 자바스크립트) (2) | 2023.05.19 |
[알고리즘 연습] 백준 1025 (제곱수 찾기, 자바스크립트) (0) | 2023.05.19 |
[알고리즘 연습] 백준 1548 (부분 삼각 수열, 자바스크립트) (2) | 2023.05.18 |