728x90
https://www.acmicpc.net/problem/10026
문제 풀이
1. 주어진 입력을 picture 2차원 Char 배열에 저장한다.
2. BFS를 한 번 수행하여 정상인의 그림 숫자를 구한다.
3. 2번 BFS를 수행 후 Visit 배열을 초기화 하고 picture 배열의 R/G 값을 임의의 X 값으로 업데이트 한다.
4. BFS 를 추가로 수행하여 적록색양의 그림 숫자를 구한다.
코드
import java.io.*
import java.util.*
fun main(args: Array<String>) {
val br = BufferedReader(InputStreamReader(System.`in`))
val N = br.readLine().toInt()
val picture = Array(N) { CharArray(N) { 'R' } }
repeat(N) { index ->
picture[index] = br.readLine().toCharArray()
}
val result = StringBuilder()
var count = 0
val visit = Array(N) { BooleanArray(N) { false } }
for (i in 0 until N) {
for (j in 0 until N) {
if (!visit[i][j]) {
count++
visit[i][j] = true
bfs(N, picture, visit, i, j, picture[i][j])
}
}
}
result.append("$count ")
count = 0
// visit 배열 초기화
repeat(N) {
Arrays.fill(visit[it], false)
}
for (i in 0 until N) {
for (j in 0 until N) {
if (picture[i][j] == 'R' || picture[i][j] == 'G') {
picture[i][j] = 'X'
}
}
}
for (i in 0 until N) {
for (j in 0 until N) {
if (!visit[i][j]) {
count++
visit[i][j] = true
bfs(N, picture, visit, i, j, picture[i][j])
}
}
}
result.append("$count")
println(result.toString())
}
private fun bfs(N: Int, picture: Array<CharArray>, visit: Array<BooleanArray>, x: Int, y: Int, target: Char) {
val queue = LinkedList<Pair<Int, Int>>()
queue.add(Pair(x, y))
while (queue.isNotEmpty()) {
val current = queue.pop()
val dX = intArrayOf(-1, 1, 0, 0)
val dY = intArrayOf( 0, 0, -1, 1)
for (i in 0..3) {
val nX = current.first + dX[i]
val nY = current.second + dY[i]
//범위 밖
if((nX < 0 || nX >= N) || (nY < 0 || nY >= N)) continue
//다른 색깔의 그림
if (target != picture[nX][nY]) continue
//이미 방문한 곳
if (visit[nX][nY]) continue
visit[nX][nY] = true
queue.add(Pair(nX, nY))
}
}
}
728x90
'알고리즘(w.KOTLIN) > 그래프(bfs, dfs, 다익스트라)' 카테고리의 다른 글
[백준][코틀린][14395] 4연산 (0) | 2023.04.14 |
---|---|
[백준][코틀린][1963] 소수 경로 (0) | 2023.04.12 |
[백준][코틀린][6087] 레이저 통신 (1) | 2023.04.11 |
[백준][16236] 아기 상어 (0) | 2023.04.10 |
[백준][코틀린][16954] 움직이는 미로 탈출 (0) | 2023.03.31 |