2615번: 오목
오목은 바둑판에 검은 바둑알과 흰 바둑알을 교대로 놓아서 겨루는 게임이다. 바둑판에는 19개의 가로줄과 19개의 세로줄이 그려져 있는데 가로줄은 위에서부터 아래로 1번, 2번, ... ,19번의 번호
www.acmicpc.net
입력과 출력
- 입력
- 19 X 19 의 바둑판
- 출력
- 승부가 났다면, 이긴 바둑알의 숫자(검: 1, 흰: 2)와 성공한 5목 중 가장 왼/위쪽에 있는 바둑알의 좌표
- 승부가 나지 않았다면, 0
문제 풀이 로직
- 5목 완성할 수 있는 8방향 중 4방향만 선택하여 함수로 구현
- 이유) 출력할 때 5목 중 가장 왼쪽이나 위쪽에 있는 위치를 출력해야 하기에, 시작점을 출력값을 잡을 때 가로/세로/오른쪽 상향/오른쪽 하향으로 비교 가능. 단, 6목을 확인할 때 양 쪽 끝 양방향 모두 확인하여 6목 방지.
- Search2 : 세로 방향으로 5목 완성인지 확인
// 세로
function Search2(i, j) {
// 6목 방지 위
if (i !== 0 && Arr[i - 1][j] === Arr[i][j]) return false
// 6목 방지 아래
if (i !== 14 && Arr[i + 5][j] === Arr[i][j]) return false
for (let k = 1; k < 5; k++) {
if (Arr[i][j] !== Arr[i + k][j]) return false
}
return true
}
- Search3 : 오른쪽 상향대각선으로 5목 완성인지 확인
// 상향 대각선
function Search3(i, j) {
// 6목 방지 아래
if (j !== 0 && i !== 18 && Arr[i + 1][j - 1] === Arr[i][j]) return false
// 6목 방지 위
if (j !== 14 && i !== 4 && Arr[i - 5][j + 5] === Arr[i][j]) return false
for (let k = 1; k < 5; k++) if (Arr[i][j] !== Arr[i - k][j + k]) return false
return true
}
- Search4 : 오른쪽 하향대각선으로 5목 완성인지 확인
// 하향 대각선
function Search4(i, j) {
// 6목 방지 위
if (i !== 0 && j !== 0 && Arr[i - 1][j - 1] === Arr[i][j]) return false
// 6목 방지 아래
if (i !== 14 && j !== 14 && Arr[i + 5][j + 5] === Arr[i][j]) return false
for (let k = 1; k < 5; k++) if (Arr[i][j] !== Arr[i + k][j + k]) return false
return true
}
- 오목 확인 함수 4가지를 실행하는 i와 j의 범위 지정하기
- Search1 : 가로 5목 ( j < 15 )
if (j < 15 && Search1(i, j)) { console.log(Arr[i][j]) console.log(i + 1, j + 1) return }
- Search2 : 세로 5목 ( i < 15 )
if (i < 15 && Search2(i, j)) { console.log(Arr[i][j]) console.log(i + 1, j + 1) return }
- Search3 : 오른쪽 상향대각선 ( i > 3 && j < 15 )
if (i > 3 && j < 15 && Search3(i, j)) { console.log(Arr[i][j]) console.log(i + 1, j + 1) return }
- Search4 : 오른쪽 하향대각선( i < 15 && j < 15 )
if (i < 15 && j < 15 && Search4(i, j)) { console.log(Arr[i][j]) console.log(i + 1, j + 1) return }
- Search1 : 가로 5목 ( j < 15 )
전체 코드
const fs = require('fs')
const path = process.platform === 'linux' ? '/dev/stdin' : 'input.txt'
Arr = fs
.readFileSync(path)
.toString()
.trim()
.split('\\n')
.map((v) => v.split(' '))
let result = false
// 가로
function Search1(i, j) {
if (j !== 0 && Arr[i][j - 1] === Arr[i][j]) return false
if (j !== 14 && Arr[i][j + 5] === Arr[i][j]) return false
for (let k = 1; k < 5; k++) if (Arr[i][j] !== Arr[i][j + k]) return false
return true
}
// 세로
function Search2(i, j) {
if (i !== 0 && Arr[i - 1][j] === Arr[i][j]) return false
if (i !== 14 && Arr[i + 5][j] === Arr[i][j]) return false
for (let k = 1; k < 5; k++) {
if (Arr[i][j] !== Arr[i + k][j]) return false
}
return true
}
// 상향 대각선
function Search3(i, j) {
if (j !== 0 && i !== 18 && Arr[i + 1][j - 1] === Arr[i][j]) return false
if (j !== 14 && i !== 4 && Arr[i - 5][j + 5] === Arr[i][j]) return false
for (let k = 1; k < 5; k++) if (Arr[i][j] !== Arr[i - k][j + k]) return false
return true
}
// 하향 대각선
function Search4(i, j) {
if (i !== 0 && j !== 0 && Arr[i - 1][j - 1] === Arr[i][j]) return false
if (i !== 14 && j !== 14 && Arr[i + 5][j + 5] === Arr[i][j]) return false
for (let k = 1; k < 5; k++) if (Arr[i][j] !== Arr[i + k][j + k]) return false
return true
}
for (let i = 0; i < Arr.length; i++) {
for (let j = 0; j < Arr.length; j++) {
if (Arr[i][j] === '0') continue
if (j < 15 && Search1(i, j)) {
console.log(Arr[i][j])
console.log(i + 1, j + 1)
return
}
if (i < 15 && Search2(i, j)) {
console.log(Arr[i][j])
console.log(i + 1, j + 1)
return
}
if (i > 3 && j < 15 && Search3(i, j)) {
console.log(Arr[i][j])
console.log(i + 1, j + 1)
return
}
if (i < 15 && j < 15 && Search4(i, j)) {
console.log(Arr[i][j])
console.log(i + 1, j + 1)
return
}
}
}
console.log('0')