๐ฃ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/16947
๐ฃ ๋ฌธ์ ํ์ด
์ฐ์ ๋ฌธ์ ๋ฅผ ์ดํดํ๋๋ฐ ์ด๋ ค์ ๋ค. ๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ๋ฉด์ + ๊ทธ๋ฆฌ๊ณ ์ธํฐ๋ท์ ์ฐพ์๋ณด๋ฉด์ ๋ฌธ์ ๋ฅผ ์ดํดํ๋ค.
์ฐ์ , '์ํ์ = ์ฌ์ดํด'์ ์ฐพ์์ผํ๋ค.
์ด ์งํ์ฒ ๋ ธ์ ๋๋ก ๋ณด๋ฉด, '์ ๋๋ฆผ'์ญ์ ์ด๋ฏธ ์ํ์ (์ฌ์ดํด) ๋ด๋ถ์ ์๊ธฐ ๋๋ฌธ์ ์ํ์ ๊น์ง์ ๊ฑฐ๋ฆฌ๊ฐ 0์ด๋ค. ํ์ง๋ง '๊น์น์ฐ'์ญ์ธ ๊ฒฝ์ฐ, ์ํ์ ์ด ์๋๋ผ ์ง์ ์ ์ํ๋ค. ์ด ๊น์น์ฐ์ญ์ '์ํ์ '๊น์ง 4๊ฐ์ ๊ฑฐ๋ฆฌ๊ฐ ์๋ค.
์ด์ฒ๋ผ ์ํ์ ๊ณผ ์ง์ ์ ๊ตฌ๋ณํ์ฌ, ์ง์ ์ ์์นํ ์ญ์ธ ๊ฒฝ์ฐ ์ํ์ ๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ฉด ๋๋ ๋ฌธ์ ์ด๋ค.
๊ทธ๋ผ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋, ํด๋น์ญ์ด ์ํ์ ์ ์์นํ๋์ง, ์ง์ ์ ์์นํ๋์ง ์์์ผํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋จผ์ ํ๋จํด์ค์ผํ๋ค.
๐ฃ ์ํ์ ์ฐพ๊ธฐ → DFS ์ด์ฉ
์ํ์ ์ด๋๊ธฐ ์ํ ์กฐ๊ฑด์ด ์๋ค. '์์์ '์ผ๋ก ๋ค์ ๋์์์ผํ๋ค๋ ๊ฒ์ด๋ค.
1๋ฒ์ญ → 2๋ฒ์ญ → 3๋ฒ์ญ → 1๋ฒ์ญ
์ด๋ ๊ฒ ๋๋ค๋ฉด, ์ 1,2,3๋ฒ์ญ์ ๋ชจ๋ ์ํ์ ์ ์์นํ๋ค.
โญ๏ธ ํ์ง๋ง 1๋ฒ์ญ → 2๋ฒ์ญ → 1๋ฒ์ญ ์ด๋ ๊ฒ ๋๋ ๊ฒฝ์ฐ, ์ํ์ ์ด๋ผ๊ณ ๋ณผ ์์๋ค. ๊ทธ๋ฅ ์์ผ๋ก ๊ฐ๋ค๊ฐ ๋ค๋ก ๋์๊ฐ๊ฒ์ด๊ธฐ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ ๋๋ฒ ์ด์ ๋ค๋ฅธ์ญ์ ๋ฐฉ๋ฌธํด์ผ๋ง! ์ํ์ ์ ํด๋น๋๋ค.โญ๏ธ ์ด ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ด๋๊ฒ ํฌ์ธํธ์ธ๊ฒ ๊ฐ๋ค...
๊ฒฐ๋ก ์ "ํ์ฌ์ญ == ์์์ญ and ๋๋ฒ ์ด์ ๋ค๋ฅธ ์ญ ๋ฐฉ๋ฌธ" ํด๋น ์กฐ๊ฑด์ ๋ง์กฑํด์ผ๋ง ์ํ์ ์ด ๋๋ค.
๐ฃ ์ํ์ ๊น์ง์ ๊ฑฐ๋ฆฌ ๊ตฌํ๊ธฐ → BFS ์ด์ฉ
์ผ๋จ ์ํ์ ์ ์ํ๋ ์ญ์ ๋ชจ๋ distance๋ฅผ 0์ผ๋ก ๋ฃ์ด์ฃผ๊ณ BFSํ์์ ํด์ค ๊ฒ์ด๋ค. ์ํ์ญ์ ์ํ์ง ์๋ ์ญ์ ๋ฐฉ๋ฌธํ ์ ์ด ์๋ ์ญ๋ค๋ง ๋ฐฉ๋ฌธํ๋ฉด์ ํ์ฌ ์ญ์ ๊ฑฐ๋ฆฌ + 1์ ํด์ฃผ๋ฉด์ ๋ค์ ์ญ์ ์ ์ฅํด์ค๋ค.
๐ฃ ๋ฌธ์ ์์ค์ฝ๋
์ธํฐ๋ท ์ฐธ๊ณ ํ๋ฉด์ ํ์๊ณ , ์๊ฐํ๋๋ฐ ์ข ํ๋ค์๋ค. ๋ง์ด ํ์ด๋ดค๋ค๊ณ ์๊ฐ๋๋๋ฐ ์ bfs/dfs ๋ ์ด๋ ต๊ฒ ๋๊ปด์ง์ง ใ ใ
//
// main.swift
// Algorithm
//
// Created by ์ด์ง์ on 2022/06/30.
//
let n = Int(readLine()!)!
var graph = Array(repeating: [Int](), count: n+1)
var visited = Array(repeating: false, count: n+1)
var cycle = Array(repeating: false, count: n + 1)
var dist = Array(repeating: 0, count: n + 1)
// ์ํ์ ?
func dfs(depth: Int, startIdx: Int, currentIdx: Int) {
if currentIdx == startIdx && depth >= 2 {
cycle[currentIdx] = true
return
}
visited[currentIdx] = true
for i in graph[currentIdx] {
if !visited[i] {
dfs(depth: depth+1, startIdx: startIdx, currentIdx: i)
} else { //์ด๋ฏธ ๋ฐฉ๋ฌธํ ์ญ์ด๋ผ๋ฉด
if depth >= 2, startIdx == i {
dfs(depth: depth, startIdx: startIdx, currentIdx: i)
}
}
}
}
// ์ํ์ ์๋์ ๋ค dfs๋๋ ค์ dist ์ฐพ์์ค
func bfs(x: Int) -> Int {
var bfsVisited = Array(repeating: false, count: 3001)
var queue = [[Int]]()
queue.append([x, 0])
while !queue.isEmpty {
let pop = queue.removeFirst()
if cycle[pop[0]] { // ์ฌ์ดํด์ ํฌํจ -> ์ฌ์ดํด์ ๋๋ฌํ๊ฑฐ์
return pop[1]
}
for i in graph[pop[0]] {
if !bfsVisited[i] {
queue.append([i, pop[1] + 1])
bfsVisited[i] = true
}
}
}
return 0
}
for _ in 0..<n {
let a = readLine()!.split(separator: " ").map{ Int(String($0))! }
graph[a[0]].append(a[1])
graph[a[1]].append(a[0])
graph[a[0]].sort()
graph[a[1]].sort()
}
// dfsํจ์ ์คํ
for i in 1...n {
visited = Array(repeating: false, count: 3001)
dfs(depth: 0, startIdx: i, currentIdx: i)
}
// cycle ์์์์ผ๋ฉด ๊ฑฐ๋ฆฌ 0 ์๋๋ฉด bfs์ ์ฉ
for i in 1...n {
if !cycle[i] {
dist[i] = bfs(x: i)
} else {
dist[i] = 0
}
}
dist.removeFirst()
print(dist.map{ String($0) }.joined(separator: " "))
'Algorithm > Baekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] (Swift) 2636๋ฒ - ์น์ฆ (BFS ํ์ด) (0) | 2022.07.06 |
---|---|
[๋ฐฑ์ค] (Swift) 16234๋ฒ - ์ธ๊ตฌ์ด๋ (BFS ํ์ด) (0) | 2022.07.06 |
[๋ฐฑ์ค] (Swift) 7576๋ฒ - ํ ๋งํ (BFS) (3) | 2022.06.23 |
[๋ฐฑ์ค] (Swift) 2178๋ฒ - ๋ฏธ๋กํ์ (BFS ํ์ด) (0) | 2022.06.23 |
[๋ฐฑ์ค] (Swift) 4963๋ฒ - ์ฌ์ ๊ฐ์ (DFS ํ์ด) (0) | 2022.06.01 |