-
[๋ฐฑ์ค] ์ด์ ๊ณ์ฐ 2644๋ฒ์๋ฃ๊ตฌ์กฐ & ์๊ณ ๋ฆฌ์ฆ 2023. 6. 4. 23:33
์ง๋๋ฒ ๋ฐ์ด๋ฌ์ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ํ ๋ค์์ผ๋ก 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์ ๋ฐํํฉ๋๋ค.
'์๋ฃ๊ตฌ์กฐ & ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค] 1์ฐจ ๋น๋ฐ์ง๋ (0) 2023.06.08 [๋ฐฑ์ค] ํ์ ๋ฒํธ 1235 (2) 2023.06.06 [๋ฐฑ์ค] ๋ฐ์ด๋ฌ์ค 2606๋ฒ (0) 2023.06.03 [ํ๋ก๊ทธ๋๋จธ์ค] ์ต๋๊ฐ๊ณผ ์ต์๊ฐ, JadenCase ๋ฌธ์์ด ๋ง๋ค๊ธฐ (0) 2023.06.03 [ํ๋ก๊ทธ๋๋จธ์ค] ๋ ๊ฐ ๋ฝ์์ ๋ํ๊ธฐ (0) 2023.06.03