[백준] 종이의 개수 (1780)(kotlin)

문제 설명

백준 1780번 문제 링크

입력 및 출력

» 입력

첫째 줄에 N(1 ≤ N ≤ 37, N은 3k 꼴)이 주어진다. 다음 N개의 줄에는 N개의 정수로 행렬이 주어진다.

» 출력

첫째 줄에 -1로만 채워진 종이의 개수를, 둘째 줄에 0으로만 채워진 종이의 개수를, 셋째 줄에 1로만 채워진 종이의 개수를 출력한다.

예제 입출력(테스트케이스)

입력 출력
9
0 0 0 1 1 1 -1 -1 -1
0 0 0 1 1 1 -1 -1 -1
0 0 0 1 1 1 -1 -1 -1
1 1 1 0 0 0 0 0 0
1 1 1 0 0 0 0 0 0
1 1 1 0 0 0 0 0 0
0 1 -1 0 1 -1 0 1 -1
0 -1 1 0 1 -1 0 1 -1
0 1 -1 1 0 -1 0 1 -1
10
12
11

문제 풀이1

소스 참고(java)

var n = 0
var check: Array<BooleanArray> = arrayOf()
var paper: Array<IntArray> = arrayOf()
val count: IntArray = IntArray(3)

fun main(args: Array<String>) = with(System.`in`.bufferedReader()) {
    n = readLine().toInt()
    paper = Array(n) { IntArray(n) }
    check = Array(n) { BooleanArray(n) }

    repeat(n) { idx ->
        paper[idx] = readLine().split(" ").map { it.toInt() }.toIntArray()
    }

    partitioner(0, 0, n)
    count.forEach { println(it) }
}

fun check(y: Int, x: Int, n: Int): Boolean {
    val cret = paper[y][x]
    for (i in x until x + n) {
        for (j in y until y + n) {
            if (cret != paper[j][i]) {
                return false
            }
        }
    }

    return true
}

fun partitioner(y: Int, x: Int, n: Int) {
    if (check(y, x, n)) {
        count[paper[y][x] + 1]++
    } else {
        val s = n / 3
        for (i in 0 until 3) {
            for (j in 0 until 3) {
                partitioner(y + j * s, x + i * s, s)
            }
        }
    }
}