문제
1780번: 종이의 개수
N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1 중 하나가 저장되어 있다. 우리는 이 행렬을 다음과 같은 규칙에 따라 적절한 크기로 자르려고 한다. 만약 종이가 모두 같은 수
www.acmicpc.net
풀이
입력받은 종이를 분할정복을 통해 처리하여 각 숫자(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 |