[๋ฐฑ์ค] ์ด์ ๊ณ์ฐ 2644๋ฒ
์ง๋๋ฒ ๋ฐ์ด๋ฌ์ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ํ ๋ค์์ผ๋ก BFS ๋ฌธ์ ์ ๋์ ํด ๋ณด์์ต๋๋ค.
์ฒ์ ๋ฌธ์ ๋ฅผ ์ ํ์ ๋, ๊ทธ๋ฆผ์ด ์์ด ๊ธ๋ก๋ง ์ค๋ช ๋์ด ์์ด์ ์ดํดํ๊ธฐ๊ฐ ์ด๋ ค์ ์ต๋๋ค.
ํ์ง๋ง ์ฒ์๋ถํฐ ์ฐจ๊ทผ์ฐจ๊ทผ ๋ฌธ์ ๋ฅผ ์ฝ์ด๋ณด๊ณ ,
์์ ์ ๋ ฅ๋ ์ซ์๋ค์ ์ดํด๋ณด๋ฉฐ ์ดํดํ๊ธฐ ์์ํ์ต๋๋ค.
1. ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/2644
๋ฌธ์
์ฐ๋ฆฌ ๋๋ผ๋ ๊ฐ์กฑ ํน์ ์น์ฒ๋ค ์ฌ์ด์ ๊ด๊ณ๋ฅผ ์ด์๋ผ๋ ๋จ์๋ก ํํํ๋ ๋ ํนํ ๋ฌธํ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ์ด๋ฌํ ์ด์๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๊ณ์ฐ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถ๋ชจ์ ์์ ์ฌ์ด๋ฅผ 1์ด์ผ๋ก ์ ์ํ๊ณ ์ด๋ก๋ถํฐ ์ฌ๋๋ค ๊ฐ์ ์ด์๋ฅผ ๊ณ์ฐํ๋ค. ์๋ฅผ ๋ค๋ฉด ๋์ ์๋ฒ์ง, ์๋ฒ์ง์ ํ ์๋ฒ์ง๋ ๊ฐ๊ฐ 1์ด์ผ๋ก ๋์ ํ ์๋ฒ์ง๋ 2์ด์ด ๋๊ณ , ์๋ฒ์ง ํ์ ๋ค๊ณผ ํ ์๋ฒ์ง๋ 1์ด, ๋์ ์๋ฒ์ง ํ์ ๋ค๊ณผ๋ 3์ด์ด ๋๋ค.
์ฌ๋ฌ ์ฌ๋๋ค์ ๋ํ ๋ถ๋ชจ ์์๋ค ๊ฐ์ ๊ด๊ณ๊ฐ ์ฃผ์ด์ก์ ๋, ์ฃผ์ด์ง ๋ ์ฌ๋์ ์ด์๋ฅผ ๊ณ์ฐํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฌ๋๋ค์ 1, 2, 3, …, n (1 ≤ n ≤ 100)์ ์ฐ์๋ ๋ฒํธ๋ก ๊ฐ๊ฐ ํ์๋๋ค. ์ ๋ ฅ ํ์ผ์ ์ฒซ์งธ ์ค์๋ ์ ์ฒด ์ฌ๋์ ์ n์ด ์ฃผ์ด์ง๊ณ , ๋์งธ ์ค์๋ ์ด์๋ฅผ ๊ณ์ฐํด์ผ ํ๋ ์๋ก ๋ค๋ฅธ ๋ ์ฌ๋์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๋ค. ๊ทธ๋ฆฌ๊ณ ์ ์งธ ์ค์๋ ๋ถ๋ชจ ์์๋ค ๊ฐ์ ๊ด๊ณ์ ๊ฐ์ m์ด ์ฃผ์ด์ง๋ค. ๋ท์งธ ์ค๋ถํฐ๋ ๋ถ๋ชจ ์์๊ฐ์ ๊ด๊ณ๋ฅผ ๋ํ๋ด๋ ๋ ๋ฒํธ x,y๊ฐ ๊ฐ ์ค์ ๋์จ๋ค. ์ด๋ ์์ ๋์ค๋ ๋ฒํธ x๋ ๋ค์ ๋์ค๋ ์ ์ y์ ๋ถ๋ชจ ๋ฒํธ๋ฅผ ๋ํ๋ธ๋ค.
๊ฐ ์ฌ๋์ ๋ถ๋ชจ๋ ์ต๋ ํ ๋ช ๋ง ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ ๋ ฅ์์ ์๊ตฌํ ๋ ์ฌ๋์ ์ด์๋ฅผ ๋ํ๋ด๋ ์ ์๋ฅผ ์ถ๋ ฅํ๋ค. ์ด๋ค ๊ฒฝ์ฐ์๋ ๋ ์ฌ๋์ ์น์ฒ ๊ด๊ณ๊ฐ ์ ํ ์์ด ์ด์๋ฅผ ๊ณ์ฐํ ์ ์์ ๋๊ฐ ์๋ค. ์ด๋์๋ -1์ ์ถ๋ ฅํด์ผ ํ๋ค.
์์ ์ ๋ ฅ
9
7 3
7
1 2
1 3
2 7
2 8
2 9
4 5
4 6
์ ๋ต : 3
9
8 6
7
1 2
1 3
2 7
2 8
2 9
4 5
4 6
์ ๋ต : -1
2. ์ฝ๋
let n = Int(readLine()!)!
let input = readLine()!.split(separator: " ").map { Int(String($0))! }
let num1 = input[0]
let num2 = input[1]
let m = Int(readLine()!)!
var graph : [[Int]] = Array(repeating: [], count: n+1)
var visited : [Bool] = Array(repeating: false, count: n+1) // n+1 ๊ฐฏ์๋งํผ Bool ๋ฐฐ์ด ๋ง๋ฌ ๋ฐฉ๋ฌธ์ true
for _ in 0..<m{
let input = readLine()!.split(separator: " ").map { Int(String($0))! }
let x = input[0]
let y = input[1]
graph[x].append(y) // graph[x] = [y]
graph[y].append(x) // graph[y] = [x]
}
print(bfs(graph: graph))
func bfs(graph: [[Int]]) -> Int{
var queue = [(num1 , 0) ] // ํ ๋ฐฐ์ด ์์ ํํ๊ฐ์ ๋ฃ์ ( ๊ฐ, ๊ฐ์ค์น )
var find : Bool = false // ๋ฐ๊ฒฌํ๋ฉด true
visited[num1] = true // ์ฒ์ ๋ฐฉ๋ฌธ์ num1 ๊ฐ์ผ๋ก ์ง์ -> ์ด์ฐจํผ ์๋ฐฉํฅ์ด๋ผ ์ด๋์ ์์ํ๋ ์ฐ๊ฒฐ๋์ด ์์
while !queue.isEmpty{
let currentNode = queue.removeFirst()
if currentNode.0 == num2{ // ํ์ฌ ๋
ธ๋์ ๊ฐ์ด num2๋ ๊ฐ๋ค๋ฉด
find = true // find ๊ฐ์ true๋ก ๋ฐ๊พธ๊ณ
return currentNode.1 // ๋ฉ์ถ๊ฒ ๋ง๋ฌ
}
for node in graph[currentNode.0]{ //currentNode.0์ ๊ฐ์ ex)2์ด๋ฉด graph[2]๊ฐ๋ 2์ธ๋ฑ์ค์ ์์
if visited[node] == true{
continue
}
visited[node] = true
queue.append((node,currentNode.1 + 1))
}
}
return -1
}
3. ์ฝ๋ ์ค๋ช
์์ ์ ๋ ฅ์ ๋ฐ์ ๋ ์ ์ฒด ์ฌ๋์ ์, ์ด์๋ฅผ ๊ณ์ฐํด์ผ ํ๋ ๋ ์ฌ๋, ๊ทธ๋ฆฌ๊ณ ๋ถ๋ชจ ์์ ๊ด๊ณ์ ๊ฐ์์ธ m๊ฐ๋ฅผ ์ ๋ ฅ๋ฐ์ต๋๋ค.
graph์ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ๋ฐฐ์ด visited์ ๋ฏธ๋ฆฌ ํฌ๊ธฐ๋ฅผ ์ค์ ํด ์ฃผ์์ต๋๋ค.
graph๋ Array(repeating: [], count: n+1)์ ํตํด ์ ์ฒด ๋
ธ๋์ ๊ฐ์ n+1๋งํผ์ ๋น ๋ฐฐ์ด []์ ์์ฑํฉ๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ ๋
ธ๋์ ๋ํ ์ฐ๊ฒฐ๋ ๋
ธ๋๋ค์ ์ ์ฅํ ์ ์์ต๋๋ค.
visited๋ Array(repeating: false, count: n+1)์ ํตํด ์ ์ฒด ๋
ธ๋์ ๊ฐ์ n+1๋งํผ์ false๋ก ์ด๊ธฐํํฉ๋๋ค. ์ด ๋ฐฐ์ด์ ๊ฐ ๋
ธ๋์ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ์ ์ฅํ๋ ์ฉ๋๋ก ์ฌ์ฉ๋ฉ๋๋ค.
๋ฐ์ด๋ฌ์ค ๋ฌธ์ ๋ฅผ ํ๊ณ ๋์ ๋ค๋ฅธ ๋ถ๋ค์ ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด์ ์ ์ ์ฝ๋์ ๋น๊ตํด ๋ณธ ๊ฒฐ๊ณผ ๋ณต์กํ๊ณ ์ด๋ ต๊ฒ ์๋ฐฉํฅ ๊ทธ๋ํ๋ฅผ ์ค์ ํ๊ณ ์์์ต๋๋ค. ํ์ง๋ง ๊ตณ์ด ๊ทธ๋ ๊ฒ ๋ณต์กํ๊ฒ ์๊ฐํ ํ์๊ฐ ์์์ต๋๋ค.
์ค์ ๋ก ๊ทธ๋ํ๋ฅผ ๊ตฌ์ฑํ ๋, graph[1]์ ๊ฐ์ ์ฐพ๊ณ ์ถ๋ค๋ฉด graph[1]์ ํธ์ถํ๋ ๊ฒ์ผ๋ก๋ ํด๋น ์ธ๋ฑ์ค์ ์ ์ฅ๋ ๊ฐ์ด ๋์ค๊ฒ ๋ฉ๋๋ค. ์ด๋ ๊ฒ ๋จ์ํ๊ฒ ์ ๊ทผํ ์ ์์ด์ ์ฝ๋๋ฅผ ๋ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ ์ ์๊ฒ ๋์์ผ๋ฉฐ ์ด๋ฐ ๋ถ๋ถ์ ๊นจ๋ซ๊ฒ ๋์์ต๋๋ค..๐
๊ทธ๋ํ๋ฅผ ๊ตฌ์ฑํ ํ์๋ queue๋ฅผ ์์ฑํฉ๋๋ค. ํ๋ ํํ ํํ๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ, ์ด๊ธฐ๊ฐ์ผ๋ก ์ฒซ ๋ฒ์งธ ์ฌ๋ num1์ ๋ฃ๊ณ , ์ด์๋ฅผ ๊ณ์ฐํ๋ฉด์ ๋ ๋ฒ์งธ ์ฌ๋ num2๊น์ง ๋๋ฌํ๋ฉด ๋ฉ์ถ์ด์ผ ํ๋ฏ๋ก ์ฐพ์ ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ find ๋ณ์๋ฅผ ์์ฑํ์์ต๋๋ค.
while๋ฌธ์ ์ฌ์ฉํ์ฌ ํ๋ฅผ ์ํํ๋ฉฐ ์ฐ๊ฒฐ๋ ๋
ธ๋๋ค์ ํ์ํฉ๋๋ค.
๊ฐ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ๋๋ง๋ค ํ์ queue.append((node, currentNode.1 + 1)) ์ ๊ฐ์ด ํ์ฌ ๋
ธ๋์ ๊ทธ๋ํ์ ๊ฐ์ค์น๋ฅผ ํจ๊ป ์ ์ฅํฉ๋๋ค. ๊ฐ์ค์น๋ ํ์ฌ ๋
ธ๋๊น์ง์ ์ด์๋ฅผ ๋ํ๋ด๋ฉฐ ํ๊ณ ์ฌ๋ผ๊ฐ ๋๋ง๋ค 1์ฉ ์ฆ๊ฐ์ํต๋๋.
๋ฐ๋ณต๋ฌธ์ ๋๋ฉด์ ํ์ฌ ํ์ ์ค์ธ ๋
ธ๋์ ๊ฐ์ด ๋ ๋ฒ์งธ ์ฌ๋ num2์ ์ผ์นํ๋ฉด ๋ฐ๋ณต๋ฌธ์ ๋ฉ์ถ๊ณ ํด๋น ๋
ธ๋๊น์ง์ ์ด์๋ฅผ ๋ฐํํฉ๋๋ค.
๋ง์ฝ ๋ ๋ฒ์งธ ์ฌ๋์ ์ฐพ์ง ๋ชปํ๋ค๋ฉด ์ด์๋ฅผ ๊ณ์ฐํ ์ ์๋ ์ํฉ์ด๋ฏ๋ก -1์ ๋ฐํํฉ๋๋ค.