반응형
[백준 10026번] 적록색약 - Kotlin
https://www.acmicpc.net/problem/10026
문제
적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다.
크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록), B(파랑) 중 하나를 색칠한 그림이 있다. 그림은 몇 개의 구역으로 나뉘어져 있는데, 구역은 같은 색으로 이루어져 있다. 또, 같은 색상이 상하좌우로 인접해 있는 경우에 두 글자는 같은 구역에 속한다. (색상의 차이를 거의 느끼지 못하는 경우도 같은 색상이라 한다)
예를 들어, 그림이 아래와 같은 경우에
RRRBB
GGBBB
BBBRR
BBRRR
RRRRR
적록색약이 아닌 사람이 봤을 때 구역의 수는 총 4개이다. (빨강 2, 파랑 1, 초록 1) 하지만, 적록색약인 사람은 구역을 3개 볼 수 있다. (빨강-초록 2, 파랑 1)
그림이 입력으로 주어졌을 때, 적록색약인 사람이 봤을 때와 아닌 사람이 봤을 때 구역의 수를 구하는 프로그램을 작성하시오.
입력
- 첫째 줄에 N이 주어진다. (1 ≤ N ≤ 100)
- 둘째 줄부터 N개 줄에는 그림이 주어진다.
출력
- 적록색약이 아닌 사람이 봤을 때의 구역의 개수와 적록색약인 사람이 봤을 때의 구역의 수를 공백으로 구분해 출력한다.
풀이
private class Solution10026 {
private val directions = arrayOf(
1 to 0,
-1 to 0,
0 to 1,
0 to -1
)
fun solution(
n: Int,
firstMap: Array<CharArray>,
secondMap: Array<CharArray>
): Pair<Int, Int> {
val visitedFirst = Array(firstMap.size) { BooleanArray(firstMap.size) }
val visitedSecond = Array(secondMap.size) { BooleanArray(secondMap.size) }
var firstCount = 0
var secondCount = 0
for (row in 0 until n) {
for (col in 0 until n) {
if (dfs(row, col, firstMap, visitedFirst)) {
firstCount += 1
}
if (dfs(row, col, secondMap, visitedSecond)) {
secondCount += 1
}
}
}
return secondCount to firstCount
}
private fun dfs(
row: Int,
col: Int,
map: Array<CharArray>,
visited: Array<BooleanArray>
): Boolean {
if (visited[row][col]) {
return false
}
visited[row][col] = true
for (direction in directions) {
val nextRow = row + direction.first
val nextCol = col + direction.second
if ((map.getOrNull(nextRow)?.getOrNull(nextCol) ?: continue) != map[row][col]) {
continue
}
dfs(nextRow, nextCol, map, visited)
}
return true
}
}
private fun main() {
val br = System.`in`.bufferedReader()
val bw = System.out.bufferedWriter()
val n = br.readLine().toInt()
val firstMap = Array(n) { CharArray(n) }
val secondMap = Array(n) { CharArray(n) }
repeat(n) { row ->
br.readLine().forEachIndexed { col, c ->
when (c) {
'R', 'B' -> {
firstMap[row][col] = c
secondMap[row][col] = c
}
'G' -> {
firstMap[row][col] = 'R'
secondMap[row][col] = c
}
}
}
}
val result = Solution10026().solution(n, firstMap, secondMap)
bw.append("${result.first} ${result.second}\\n")
bw.flush()
br.close()
bw.close()
}
- 적색, 블루와 적+녹, 블루로 구분하여 dfs 실행
반응형
'Software > 백준' 카테고리의 다른 글
[백준 2606번] 바이러스 - Kotlin (0) | 2024.04.23 |
---|---|
[백준 2667번] 단지번호붙이기 - Kotlin (0) | 2024.04.23 |
[백준 15686번] 치킨 배달 - Kotlin (0) | 2024.04.22 |
[백준 9935번] 문자열 폭발 - Kotlin (0) | 2024.04.16 |
[백준 12100번] 2048 (Easy) - Kotlin (1) | 2024.04.07 |