문제
2630번: 색종이 만들기
첫째 줄에는 전체 종이의 한 변의 길이 N이 주어져 있다. N은 2, 4, 8, 16, 32, 64, 128 중 하나이다. 색종이의 각 가로줄의 정사각형칸들의 색이 윗줄부터 차례로 둘째 줄부터 마지막 줄까지 주어진다.
www.acmicpc.net

풀이
분할정복이란 큰 문제를 작은 문제로 나누어 해결하는 재귀적인 알고리즘이다. 일반적으로 세 단계로 구성된다.
- 분할(Divide): 주어진 문제를 더 작은 부분 문제들로 분할한다. 부분 문제들은 원래 문제와 동일한 형태를 가진다.
- 정복(Conquer): 부분 문제들을 재귀적으로 해결하여 부분 해를 구한다.
- 통합(Combine): 작은 부분 문제들의 해를 결합하여 원래 문제의 해를 구한다.
문제는 분할정복을 활용하여 종이의 색깔 개수를 세는 문제이다. 주어진 종이를 네 부분으로 나누어 재귀적으로 탐색하고 같은 색상으로 이루어진 종이를 찾을 때마다 해당하는 색의 개수를 세어준다.
코드
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 blue = 0 var white = 0 fun checkPaper(size: Int, x: Int, y: Int): Boolean { val color = paper[x][y] for(i in x until x+size) { for(j in y until y+size) { if(paper[i][j] != color) return false } } return true } fun divide(size: Int, x: Int, y: Int) { if (size == 1 || checkPaper(size, x, y)) { if (paper[x][y] == 1) blue++ else white++ } else { divide(size/2, x, y) divide(size/2, x + size/2, y) divide(size/2, x, y + size/2) divide(size/2, x + size/2, y + size/2) } } divide(size, 0, 0) bw.write("$white\n$blue") bw.flush() bw.close() br.close() }
'알고리즘 > Baekjoon' 카테고리의 다른 글
[백준] 9205번: 맥주 마시면서 걸어가기 - Kotlin[코틀린] (0) | 2024.02.26 |
---|---|
[백준] 1992번: 쿼드트리 - Kotlin[코틀린] (0) | 2024.02.06 |
[백준] 2503번: 숫자 야구 - Kotlin[코틀린] (0) | 2024.01.29 |
[백준] 11729번: 하노이 탑 이동 순서 - Kotlin[코틀린] (0) | 2024.01.25 |
[백준] 11000번: 강의실 배정 - Kotlin[코틀린] (0) | 2024.01.22 |