[백준] 적록색약 (10026)

문제 설명

백준 10026번 문제 링크

입력 및 출력

» 입력

  • 첫째 줄에 N이 주어진다. (1 ≤ N ≤ 100) 둘째 줄부터 N개 줄에는 그림이 주어진다.

» 출력

적록색약이 아닌 사람이 봤을 때의 구역의 개수와 적록색약인 사람이 봤을 때의 구역의 수를 공백으로 구분해 출력한다.

예제 입출력(테스트케이스)

입력 출력
5
RRRBB
GGBBB
BBBRR
BBRRR
RRRRR
4 3

문제 풀이(SWIFT) 1

//
//  main.swift
//  BOJ10026_SWIFT
//
//  Created by choiyoujun on 2022/03/11.
//

func search(target: String, x: Int, y: Int, isAb: Bool, check: inout [[Bool]]) {
    var q = [(x, y)]
    var left = 0
    let dx = [0, 1, 0, -1]
    let dy = [1, 0, -1, 0]
    check[y][x] = true
    
    while left < q.count {
        let current = q[left]
        
        for i in 0..<4 {
            let nx = current.0 + dx[i]
            let ny = current.1 + dy[i]
            
            if nx >= 0 && nx < N && ny >= 0 && ny < N {
                if !isAb {
                    if picture[ny][nx] == target && !check[ny][nx] {
                        check[ny][nx] = true
                        q.append((nx, ny))
                    }
                } else {
                    if target == "B" {
                        if (picture[ny][nx] == "B") && !check[ny][nx] {
                            check[ny][nx] = true
                            q.append((nx, ny))
                        }
                    } else {
                        if (picture[ny][nx] == "R" || picture[ny][nx] == "G") && !check[ny][nx] {
                            check[ny][nx] = true
                            q.append((nx, ny))
                        }
                    }
                }
            }
        }
        
        left += 1
    }
}

let N = Int(readLine()!)!
var picture = [[String]](repeating: [String](repeating: "", count: N), count: N)
var check = [[Bool]](repeating: [Bool](repeating: false, count: N), count: N)
var nCount = 0
var abCount = 0

for i in 0..<N {
    picture[i] = readLine()!.map { String($0) }
}

for y in 0..<N {
    for x in 0..<N {
        if !check[y][x] {
            search(target: picture[y][x], x: x, y: y, isAb: false, check: &check)
            nCount += 1
        }
    }
}

check = [[Bool]](repeating: [Bool](repeating: false, count: N), count: N)
for y in 0..<N {
    for x in 0..<N {
        if !check[y][x] {
            search(target: picture[y][x], x: x, y: y, isAb: true, check: &check)
            abCount += 1
        }
    }
}

print(nCount, abCount)

태그:

카테고리:

업데이트: