๋ฐฑ์ค€ - ์ „์Ÿ์ „ํˆฌ(Swift)

2022. 12. 2. 14:28ใ†์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

๋ฐฑ์ค€ - ์ „์Ÿ์ „ํˆฌ(Swift)

 

 

 ๋ฌธ์ œ ์„ค๋ช…

 

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

 

1303๋ฒˆ: ์ „์Ÿ - ์ „ํˆฌ

์ฒซ์งธ ์ค„์—๋Š” ์ „์Ÿํ„ฐ์˜ ๊ฐ€๋กœ ํฌ๊ธฐ N, ์„ธ๋กœ ํฌ๊ธฐ M(1 ≤ N, M ≤ 100)์ด ์ฃผ์–ด์ง„๋‹ค. ๊ทธ ๋‹ค์Œ ๋‘ ๋ฒˆ์งธ ์ค„์—์„œ M+1๋ฒˆ์งธ ์ค„์—๋Š” ๊ฐ๊ฐ (X, Y)์— ์žˆ๋Š” ๋ณ‘์‚ฌ๋“ค์˜ ์˜ท์ƒ‰์ด ๋„์–ด์“ฐ๊ธฐ ์—†์ด ์ฃผ์–ด์ง„๋‹ค. ๋ชจ๋“  ์ž๋ฆฌ์—๋Š”

www.acmicpc.net

 

 ๋‚˜์˜ ํ’€์ด

 

๊ฐ„๋‹จํ–ˆ๋˜ DFS, BFS๋ฌธ์ œ์˜€์ง€๋งŒ ํ์—์„œ ๊บผ๋‚ด๋Š” ๊ฐ’์„ var๋กœ ๋‘ ์œผ๋กœ์จ ๋ˆ„์ ๋˜์ง€์•Š์„๋•Œ๋„ ๋ˆ„์ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์ด ์กฐ๊ธˆ ์˜ค๋ž˜๊ฑธ๋ ธ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ญ‰์ณ์žˆ๋Š” B์™€ W๋“ค์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด ํฌ์ธํŠธ์˜€๋Š”๋ฐ BFS๋กœ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋ ค๊ณ ํ•˜๋Š” ํŒ๋‹จ์˜ค๋ฅ˜๊ฐ€ ์žˆ์—ˆ๋‹ค. 

๊ทธ๋ž˜์„œ BFS๋กœ ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ–ˆ๋‹ค. (DFS๋“  BFS๋“  ์ƒ๊ด€์—†์ง€๋งŒ ์ด ๋ฌธ์ œ๋Š” DFS์ ์ธ ์‚ฌ๊ณ ๊ฐ€ ๋” ์˜ฌ๋ฐ”๋ฅธ ํ•ด๋‹ต์œผ๋กœ ๋ณด์ธ๋‹ค)

 

๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ์‚ฌ๋žŒ์˜ ํ’€์ด๋ฅผ ๋ณด๋‹ˆ ๊ตณ์ด WBFS์™€ BBFS๋กœ ๋‚˜๋ˆ„์ง€ ์•Š๊ณ  BFS๋ฅผ ํ˜ธ์ถœํ• ๋•Œ G[i][j]๊ฐ’๋„ ๋„˜๊ฒจ์คŒ์œผ๋กœ์จ ์ด์ „์— ๊ฐ’๊ณผ ๊ฐ™์€ ๊ฐ’์— ๋Œ€ํ•ด์„œ๋งŒ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค. 

 

import Foundation

let nm = readLine()!.components(separatedBy:" ").map{Int($0)!}
let dx = [-1, 0, 1, 0]
let dy = [0, -1, 0, 1]
let N = nm[1], M = nm[0]
let xRange = 0..<N
let yRange = 0..<M
var G = [[String]]()
var visited = Array(repeating: Array(repeating: false, count: M), count: N)
var distance = Array(repeating: Array(repeating: 0, count: M), count: N)
var blueCnt = 0
var whiteCnt = 0
for _ in 0..<N {
    G.append(readLine()!.map{String($0)})
}

func BFS(_ x: Int, _ y: Int) {
    if G[x][y] == "B" {
        BBFS(x, y)
    } else {
        WBFS(x, y)
    }
}

func BBFS(_ x: Int, _ y: Int) {
    var cnt = 1
    var index = 0
    var queue = [(Int, Int)]()
    var maxBlue = 1
    visited[x][y] = true
    queue.append((x, y))
    while index < queue.count {
        let curr = queue[index]
        let x = curr.0, y = curr.1
        index += 1
        for i in 0..<4 {
            let nx = x + dx[i]
            let ny = y + dy[i]
            if xRange ~= nx, yRange ~= ny, !visited[nx][ny], G[nx][ny] == "B" {
                cnt += 1
                visited[nx][ny] = true
                queue.append((nx, ny))
            }
        }
    }
    blueCnt += (cnt * cnt)
}

func WBFS(_ x: Int, _ y: Int) {
    var cnt = 1
    var index = 0
    var queue = [(Int, Int)]()
    var maxWhite = 1
    visited[x][y] = true
    queue.append((x, y))
    while index < queue.count {
        let curr = queue[index]
        let x = curr.0, y = curr.1
        index += 1
        for i in 0..<4 {
            let nx = x + dx[i]
            let ny = y + dy[i]
            if xRange ~= nx, yRange ~= ny {
                if G[nx][ny] == "W", !visited[nx][ny] {
                    cnt += 1
                    visited[nx][ny] = true
                    queue.append((nx, ny))
                }
                
            }
        }
    }
    whiteCnt += (cnt * cnt)
}

for i in 0..<N {
    for j in 0..<M {
        if !visited[i][j] {
            BFS(i, j)
        }
    }
}





print("\(whiteCnt) \(blueCnt)")

 

 ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด

 

 

import Foundation

let nm = readLine()!.components(separatedBy:" ").map{Int($0)!}
let dx = [-1, 0, 1, 0]
let dy = [0, -1, 0, 1]
let N = nm[1], M = nm[0]
let xRange = 0..<N
let yRange = 0..<M
var G = [[String]]()
var visited = Array(repeating: Array(repeating: false, count: M), count: N)
var distance = Array(repeating: Array(repeating: 0, count: M), count: N)
var blueCnt = 0
var whiteCnt = 0
for _ in 0..<N {
    G.append(readLine()!.map{String($0)})
}

func BFS(_ x: Int, _ y: Int, _ c: String) {
    var cnt = 1
    var index = 0
    var queue = [(Int, Int)]()
    var maxWhite = 1
    visited[x][y] = true
    queue.append((x, y))
    while index < queue.count {
        let curr = queue[index]
        let x = curr.0, y = curr.1
        index += 1
        for i in 0..<4 {
            let nx = x + dx[i]
            let ny = y + dy[i]
            if xRange ~= nx, yRange ~= ny {
                if G[nx][ny] == c, !visited[nx][ny] {
                    cnt += 1
                    visited[nx][ny] = true
                    queue.append((nx, ny))
                }   
            }
        }
    }
    if G[x][y] == "W" {
        whiteCnt += (cnt * cnt)
    } else {
        blueCnt += (cnt * cnt)
    }
}

for i in 0..<N {
    for j in 0..<M {
        if !visited[i][j] {
            BFS(i, j, G[i][j])
        }
    }
}


print("\(whiteCnt) \(blueCnt)")