โ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/16234
โ ๋ฌธ์ ํ์ด ์์ด๋์ด
๊ธฐ๋ณธ์ ์ผ๋ก ์ฐํฉ๊ตญ๊ฐ์ธ์ง ์๋์ง๋ฅผ ํ๋จํด์ผํ๊ธฐ ๋๋ฌธ์ BFS๋ก ํ์ด์ผํ๋ค๊ณ ์๊ฐํ๋ค. ์์ ์ถ๋ ฅ์์ ๋ฅผ ๋ณด๋ฉด, ์ ์ ์ด ์๊ธฐ๋ ์์น๊ฐ ๋ค๋ฅด๋ค.
30๊ณผ 40์ ์ง์ ์ ์ธ ์ฐ๊ฒฐ์ ์๋์ง๋ง, ์ด์จ๋ ์ฐํฉ๊ตญ๊ฐ์ด๊ธดํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ด๋ฐ์ ์ด๋ ต๊ฒ๋ง ์๊ฐ๋์๋ "์ด๋์ ์ ์ ์ด์๊ธฐ๋์ง ๊ณ ๋ คํด์ผํ๋๊ฐ"๋ฅผ ์ ํ ์๊ฐํ์ง ์๊ณ ๊ทธ๋ฅ ํ์ํ๋ฉด์ ์ฐํฉ๊ตญ๊ฐ์ ๊ฐ์ด ๋ด์์ฃผ๋ฉด๋๋ค. ์ฆ, ์ ์ ์ ๊ณ ๋ คํ์ง ์์๋ ๋๋ค๋ ์ด์ผ๊ธฐ๋ค!
๊ธฐ๋ณธ BFS ์๊ณ ๋ฆฌ์ฆ์ฒ๋ผ, ๊ทธ๋ํ ๋ชจ๋๋ฅผ ํ์ํด์ฃผ๋ฉด์, ์ฐํฉ๊ตญ๊ฐ์ ์๊ฒฉ์ด ์ถฉ์กฑ๋๋ฉด visited์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๋ ๋ฐฉ์์ผ๋ก ์งํํ๋ค.
1. BFS ์๊ณ ๋ฆฌ์ฆ ๋ด๋ถ์์๋ L์ด์ R ์ดํ์ ์ฐจ์ด๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด union์ด๋ผ๋ ๋ณ์์ ์ ์ฅํด์ฃผ์๋ค.
2. ๊ทธ๋ฆฌ๊ณ union์์ ๋ค์ด๊ฐ์๋ค๋ฉด, ์ธ๊ตฌ์๋ฅผ ๊ฐฑ์ ํด์ฃผ์ด์ผ ํ๊ธฐ ๋๋ฌธ์, unionPopulation์ ๊ตฌํด์ ๊ฐ์ ๋ฐ๊ฟ์ค๋ค.
3. main์ฝ๋!! BFS์๊ณ ๋ฆฌ์ฆ์ return ๊ฐ์ union.count์ธ๋ฐ, union ์ count๊ฐ 2๊ฐ ์ด์์ด๋ฉด, ์ธ๊ตฌ์ ์ด๋์ด ๋ฐ์ํ๋ค๋ ๋ป์ด๊ธฐ ๋๋ฌธ์ union.count๊ฐ 2์ด์์ด ์๋๋๊น์ง while ๋ฌธ์ ๋๋ ค์ค๋ค.
โ ์ ์ฒด ์์ค์ฝ๋
//
// main.swift
// Algorithm
//
// Created by LeeJiSoo on 2022/07/06.
//
import Foundation
let nlr = readLine()!.split(separator: " ").map { Int(String($0))! }
var ground = [[Int]]()
let n = nlr[0]
let l = nlr[1]
let r = nlr[2]
let dx = [-1, 1, 0, 0]
let dy = [0, 0, -1, 1] // ์ํ์ข์ฐ
var visited = Array(repeating: Array(repeating: false, count: n), count: n)
for _ in 0..<n {
ground.append(readLine()!.split(separator: " ").map { Int(String($0))! })
}
func bfs(_ i: Int, _ j: Int) -> Int {
var queue = [(Int, Int)]()
queue.append((i, j))
visited[i][j] = true // ๋ฐฉ๋ฌธ์ฒ๋ฆฌ
var union = [(Int, Int)]() // ์ฐํฉ๊ตญ๊ฐ ์ด๊ธฐํํ๊ณ , ๋ค์ ๋ฃ์ด์ฃผ๋ ๊ณผ์
union.append((i, j))
var count = 0 // ์ฐํฉ๊ตญ๊ฐ์ ์ธ๊ตฌ์๋ฅผ ๋ํด์ฃผ๋ ๋ณ์
count += ground[i][j]
while !queue.isEmpty {
let xy = queue.removeFirst()
let x = xy.0
let y = xy.1
for k in 0..<4 {
let nx = x + dx[k]
let ny = y + dy[k]
if nx < 0 || nx >= n || ny < 0 || ny >= n {
continue
}
if visited[nx][ny] {
continue
}
// ์กฐ๊ฑด ์ถฉ์กฑํ๋ฉด union ์ ๋ฃ์ด์ฃผ์ด์ ์ ์ธ์ด์ฃผ๊ธฐ
if l <= abs(ground[nx][ny] - ground[x][y]), abs(ground[nx][ny] - ground[x][y]) <= r {
union.append((nx, ny))
visited[nx][ny] = true
count += ground[nx][ny]
queue.append((nx, ny))
}
}
}
// ์ฐํฉ๊ตญ๊ฐ๋ค์ ์ธ๊ตฌ ์
let unionPopulation = Int(floor(Double(count) / Double(union.count)))
for country in union {
ground[country.0][country.1] = unionPopulation
}
return union.count
}
// 2. ์ฐํฉ๊ตญ๊ฐ๊ฐ 2๊ฐ ์ด์์ด๋ฉด bfs ํตํด์ ๊ณ์ ์ธ๊ตฌ์ด๋์ ํ์ธํด์ผํจ
var day = 0
while true {
visited = Array(repeating: Array(repeating: false, count: n), count: n) // visited ์ด๊ธฐํ
var check = false // ์ธ๊ตฌ ์ด๋ ์กด์ฌ ์ ๋ฌด ์ฒดํฌ
for i in 0..<n {
for j in 0..<n {
if !visited[i][j] {
if bfs(i, j) >= 2 {
check = true
}
}
}
}
if !check { // ๋์ด์ union ์ ๊ฐ์๊ฐ ์๋ ๊ฒฝ์ฐ check๊ฐ false ์
break
}
day += 1
}
print(day)
'Algorithm > Baekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] (Swift) 1912๋ฒ - ์ฐ์ํฉ (๊ฐ์ฅ ๊ธฐ์ด์ ์ธ DP ๋ฌธ์ ) (0) | 2022.07.07 |
---|---|
[๋ฐฑ์ค] (Swift) 2636๋ฒ - ์น์ฆ (BFS ํ์ด) (0) | 2022.07.06 |
[๋ฐฑ์ค] (Swift) 16947๋ฒ - ์์ธ ์งํ์ฒ 2ํธ์ (BFS, DFS ๋์์ ์ฌ์ฉํ๋ ๋ฌธ์ ) (0) | 2022.06.30 |
[๋ฐฑ์ค] (Swift) 7576๋ฒ - ํ ๋งํ (BFS) (3) | 2022.06.23 |
[๋ฐฑ์ค] (Swift) 2178๋ฒ - ๋ฏธ๋กํ์ (BFS ํ์ด) (0) | 2022.06.23 |