Uknow's Lab.
article thumbnail

https://www.acmicpc.net/problem/2615

 

2615번: 오목

오목은 바둑판에 검은 바둑알과 흰 바둑알을 교대로 놓아서 겨루는 게임이다. 바둑판에는 19개의 가로줄과 19개의 세로줄이 그려져 있는데 가로줄은 위에서부터 아래로 1번, 2번, ... ,19번의 번호

www.acmicpc.net

 

난이도 : 실버 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년이 걸린, 상당히 애증의 문제였던 것 같습니다 ㅎㅎ;

profile

Uknow's Lab.

@유노 Uknow

인생은 Byte와 Double 사이 Char다. 아무말이나 해봤습니다.