본문 바로가기

알고리즘(w.KOTLIN)/그래프(bfs, dfs, 다익스트라)

[백준][코틀린][10026] 적록색약

728x90

https://www.acmicpc.net/problem/10026

 

10026번: 적록색약

적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다. 크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록)

www.acmicpc.net

문제 풀이

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