문제
풀이
입력받은 종이를 분할정복을 통해 처리하여 각 숫자(1, 0, -1)의 개수를 세는 문제이다.
입력받은 종이를 3X3 크기로 나누어 분할정복을 수행한다. 만약 현재 영역의 숫자가 모두 같다면 해당 숫자의 개수를 세고, 그렇지 않다면 3X3 영역을 다시 9개의 부분 영역으로 나누어 재귀적으로 처리한다.
이를 통해 종이 전체를 처리하면서 1, 0, -1의 개수를 각각 세어 결과를 출력한다.
코드
fun main() {
val br = System.`in`.bufferedReader()
val bw = System.out.bufferedWriter()
val size = br.readLine().toInt()
val paper = Array(size){ br.readLine().split(' ').map { it.toInt() } }
var zero = 0
var minus = 0
var plus = 0
fun checkPaper(num: Int, x: Int, y: Int): Boolean {
val first = paper[x][y]
for(i in x until x+num) {
for(j in y until y+num) {
if(first != paper[i][j]) return false
}
}
return true
}
fun divide(num: Int, x: Int, y: Int) {
if(num==1 || checkPaper(num,x,y)) {
when(paper[x][y]) {
1 -> plus++
-1 -> minus++
0 -> zero++
}
} else {
repeat(3) { i ->
repeat(3) { j ->
divide(num / 3, x + i * num / 3, y + j * num / 3)
}
}
}
}
divide(size, 0, 0)
bw.write("$minus\n$zero\n$plus")
bw.flush()
bw.close()
br.close()
}
'알고리즘 > Baekjoon' 카테고리의 다른 글
[백준] 1783번: 병든 나이트 - Kotlin[코틀린] (0) | 2024.02.29 |
---|---|
[백준] 1080번: 행렬 - Kotlin[코틀린] (0) | 2024.02.28 |
[백준] 9205번: 맥주 마시면서 걸어가기 - Kotlin[코틀린] (0) | 2024.02.26 |
[백준] 1992번: 쿼드트리 - Kotlin[코틀린] (0) | 2024.02.06 |
[백준] 2630번: 색종이 만들기 - Kotlin[코틀린] (0) | 2024.02.05 |