[백준] 적록색약 (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)