https://www.acmicpc.net/problem/2615
난이도 : 실버 1
태그 : 구현, 브루트포스
설명
다섯개를 연속으로 놓으면 승리하는 오목게임 문제입니다.
단, 육목이 되면 계속 진행합니다.
저는 한 점을 기준으로 오른쪽, 대각선 오른쪽 아래, 아래쪽 세 방향으로 탐색하면서,
같은 색의 돌이 5개 연속이고, 6개 연속이 되지 않으면서, 1칸 이전(왼쪽, 대각선 왼쪽 위, 위쪽)에 돌이 있는지 체크해줬습니다.
1칸 이전에 돌이 있으면 육목이기 때문입니다.
소스코드
import java.util.*
import kotlin.system.exitProcess
fun main() = with(System.`in`.bufferedReader()) {
val dx = intArrayOf(1, 1, 0, -1)
val dy = intArrayOf(0, 1, 1, 1)
val map = Array(19) {
val st = StringTokenizer(readLine())
Array(19) { st.nextToken().toInt() }
}
repeat(19) { x ->
repeat(19) { y ->
if (map[x][y] != 0) {
val color = map[x][y]
for (i in 0..3) {
var cnt = 1
var nx = x + dx[i]
var ny = y + dy[i]
while (nx in 0 until 19 && ny in 0 until 19 && map[nx][ny] == color) {
cnt++
if (cnt == 5) {
val prevX = x - dx[i]
val prevY = y - dy[i]
val nextX = nx + dx[i]
val nextY = ny + dy[i]
if (prevX in 0 until 19 && prevY in 0 until 19 && map[prevX][prevY] == color) break
if (nextX in 0 until 19 && nextY in 0 until 19 && map[nextX][nextY] == color) break
println(color)
println("${x + 1} ${y + 1}")
exitProcess(0)
}
nx += dx[i]
ny += dy[i]
}
}
}
}
}
println(0)
}
후기
2년전에 처음 만나고, 나중에 풀어야겠다고 포기했던 문제였습니다.
오랜만에 눈에 띄어 풀어봤는데, 이번에도 꽤 많이 틀렸지만 드디어 맞았습니다를 받았네요.
2년이 걸린, 상당히 애증의 문제였던 것 같습니다 ㅎㅎ;
'코딩테스트 > Kotlin' 카테고리의 다른 글
[백준 2696번] [Kotlin] 중앙값 구하기 (0) | 2023.06.13 |
---|---|
[백준 2610번] [Kotlin] 회의준비 (0) | 2023.06.12 |
[백준 17136번] [Kotlin] 색종이 붙이기 (0) | 2023.06.10 |
[백준 11000번] [Kotlin] 강의실 배정 (0) | 2023.06.05 |
[백준 17371번] [Kotlin] 이사 (0) | 2023.06.02 |