경험의 기록

문제

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

 

10026번: 적록색약

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

www.acmicpc.net

 

풀이

0. 문제 해석

색약인 경우와 아닌 경우를 각각 DFS 를 통해 탐색한다.

색약은 R,G를 구분하지 못하므로

R = 1, G = 2, B = 4로 입력받고 그 차이가 1 이하일때만 탐색하도록 하였다.

 

1. 전체 코드

// [백준] 10026. 적록색약 (Kotlin)
import java.io.BufferedReader
import java.io.InputStreamReader
import kotlin.math.abs

var n = 0
lateinit var arr : Array<Array<Int>>
lateinit var arrC : Array<Array<Int>>
lateinit var visit : Array<Array<Boolean>>
lateinit var visitC: Array<Array<Boolean>>

// 상하좌우
val dx = arrayOf(-1,1,0,0)
val dy = arrayOf(0,0,-1,1)

fun main() = with(BufferedReader(InputStreamReader(System.`in`))){
    n = readLine().toInt()
    arr = Array(n) {Array(n) {0}}
    arrC = Array(n) {Array(n) {0}}
    visit = Array(n) {Array(n) {false}}
    visitC = Array(n) {Array(n) {false}}

    var count = 0
    var countC = 0

    // 그림 정보 입력
    for(i in 0 until n){
        val str = readLine()
        for(j in str.indices){
            when(str[j]){
                'R' -> arr[i][j] = 1
                'G' -> arr[i][j] = 2
                'B' -> arr[i][j] = 4
            }
        }
    }

    // dfs
    for(i in 0 until n){
        for(j in 0 until n){
            if(!visit[i][j]){
                dfs(i,j,false)
                count++
            }

            if(!visitC[i][j]){
                dfs(i,j,true)
                countC++
            }
        }
    }

    println("$count $countC")
}

// color : false (색약)
fun dfs(x: Int, y: Int, color: Boolean){
    if(!color){
        visit[x][y] = true
    }
    else{
        visitC[x][y] = true
    }

    for(i in 0 until 4){
        val nextX = x + dx[i]
        val nextY = y + dy[i]

        // null check
        if(nextX < 0 || nextY < 0 || nextX >= n || nextY >= n){
            continue
        }

        // 상하좌우 탐색
        if(!color) {
            if (!visit[nextX][nextY] && (arr[x][y] == arr[nextX][nextY])) {
                dfs(nextX, nextY, false)
            }
        }
        else{
            val tmp = abs(arr[x][y] - arr[nextX][nextY])
            if (!visitC[nextX][nextY] && tmp <= 1) {
                dfs(nextX, nextY, true)
            }
        }
    }
}
반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading