Bibi's DevLog ๐ค๐
[Swift] BFS ์์ ์ ํ์ด (๋ฐฑ์ค 2178 ๋ฏธ๋ก ํ์) ๋ณธ๋ฌธ
[Swift] BFS ์์ ์ ํ์ด (๋ฐฑ์ค 2178 ๋ฏธ๋ก ํ์)
๋น๋น bibi 2023. 1. 16. 23:05[Swift] BFS ์์ ์ ํ์ด (๋ฏธ๋ก ํ์)
BFS (Breadth First Search, ๋๋น ์ฐ์ ํ์)
- ์ธ์ ํ ๋ ธ๋๋ค์ ์ฐ์ ํ์ํ๋ ๋ฐฉ์.
- ๊ฐ๊น์ด ๋
ธ๋๋ถํฐ ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ.
- 1950๋ ๋ฏธ๋ก๋ฅผ ํ์ถํ๋ ๊ฐ์ฅ ์งง์ ๊ฒฝ๋ก๋ฅผ ์ฐพ๊ธฐ ์ํด ํ์ํ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
- ํ๋ฅผ ์ฌ์ฉํด ๊ตฌํํ๋ ๊ฒ์ด ์ ์์ด๋ค.
- ์ธ์ ๋ ธ๋๋ฅผ ํ์ ๋ฃ์ผ๋ฉด ์์ฐ์ค๋ฝ๊ฒ ์ ์ ์ ์ถ์ด ๋์ด ๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ํ์ํ๊ฒ ๋๋ค.
O(n)
์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค. (n
= ๋ฐ์ดํฐ์ ๊ฐ์)- ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ ์ค์ ์ํ ์๊ฐ์ DFS๋ณด๋ค BFS๊ฐ ๋น ๋ฅธ ํธ์ด๋ค.
๋์ ๊ณผ์
- ํ์ ์์ ๋ ธ๋๋ฅผ ์คํ์ ์ฝ์ ํ๊ณ , ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- ํ์์ ๋
ธ๋๋ฅผ ๊บผ๋ด, ํด๋น ๋
ธ๋์ ์ธ์ ๋
ธ๋ ์ค์์ ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋๋ฅผ ๋ชจ๋ ํ์ ์ฝ์
ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- ๋ง์ฝ ์ธ์ ๋ ธ๋ ์ค ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๊ฐ ์ฌ๋ฌ ๊ฐ๋ฉด, ๊ฐ์ด ๋ฎ์ ๋ ธ๋ or ์ผ์ชฝ ๋ ธ๋๋ฅผ ๋จผ์ ํ์ ์ฝ์ ํ๋ค.
- ์ ๋ต์ ์ฐพ๊ฑฐ๋, ๋ชจ๋ ๋
ธ๋๋ฅผ ํ์ํ ๋๊น์ง 2.๋ฅผ ๋ฐ๋ณตํ๋ค.
- ์ ๋ต์ ์ฐพ์๋ค๋ฉด ํ์์ ๋ฉ์ถ๋ค.
์์ - ๋ฐฑ์ค 2178 ๋ฏธ๋ก ํ์
๋ฌธ์
N×Mํฌ๊ธฐ์ ๋ฐฐ์ด๋ก ํํ๋๋ ๋ฏธ๋ก๊ฐ ์๋ค.
๋ฏธ๋ก์์ 1์ ์ด๋ํ ์ ์๋ ์นธ์ ๋ํ๋ด๊ณ , 0์ ์ด๋ํ ์ ์๋ ์นธ์ ๋ํ๋ธ๋ค. ์ด๋ฌํ ๋ฏธ๋ก๊ฐ ์ฃผ์ด์ก์ ๋, (1, 1)์์ ์ถ๋ฐํ์ฌ (N, M)์ ์์น๋ก ์ด๋ํ ๋ ์ง๋์ผ ํ๋ ์ต์์ ์นธ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ํ ์นธ์์ ๋ค๋ฅธ ์นธ์ผ๋ก ์ด๋ํ ๋, ์๋ก ์ธ์ ํ ์นธ์ผ๋ก๋ง ์ด๋ํ ์ ์๋ค.
์์ 1์์๋ 15์นธ์ ์ง๋์ผ (N, M)์ ์์น๋ก ์ด๋ํ ์ ์๋ค. ์นธ์ ์ ๋์๋ ์์ ์์น์ ๋์ฐฉ ์์น๋ ํฌํจํ๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๋ ์ ์ N, M(2 ≤ N, M ≤ 100)์ด ์ฃผ์ด์ง๋ค. ๋ค์ N๊ฐ์ ์ค์๋ M๊ฐ์ ์ ์๋ก ๋ฏธ๋ก๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ๊ฐ์ ์๋ค์ ๋ถ์ด์ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ง๋์ผ ํ๋ ์ต์์ ์นธ ์๋ฅผ ์ถ๋ ฅํ๋ค. ํญ์ ๋์ฐฉ์์น๋ก ์ด๋ํ ์ ์๋ ๊ฒฝ์ฐ๋ง ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ค.
์์ ์ ๋ ฅ 1
4 6
101111
101010
101011
111011
์์ ์ถ๋ ฅ 1
15
์์ ์ ๋ ฅ 2
4 6
110110
110110
111111
111101
์์ ์ถ๋ ฅ 2
9
ํ์ด
let inputArr = readLine()!.split(separator: " ").map { Int($0)! }
let n = inputArr[0]
let m = inputArr[1]
var maze = [[Int]]()
for _ in (0..<n) { // ๋ฏธ๋ก๋ฅผ ์ด์ฐจ์๋ฐฐ์ด์ ์
๋ ฅ
let innerArr = readLine()!.map { Int(String($0))! }
maze.append(innerArr)
}
var queue = [(0,0)] // ํ์ ๋ฏธ๋ก์ ์์์ ์ ๋ฃ๊ณ ์์
let dx = [-1, 1, 0, 0] // ์ํ์ข์ฐ 1์นธ์ฉ ์ด๋ํ ๋์ x์ขํ, y์ขํ
let dy = [0, 0, -1, 1]
while !queue.isEmpty { // ํ๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต
let (x, y) = queue.removeFirst()
for i in (0..<4) { // xy์ ์ํ์ข์ฐ์ ๋ํด
let nx = x + dx[i] // x์ขํ, y์ขํ ์ด๋
let ny = y + dy[i]
// x ๋๋ y ์ขํ๊ฐ ๋ฏธ๋ก๋ฅผ ๋ฒ์ด๋๋ฉด ์ด๋x
if nx < 0 || ny < 0 || nx >= n || ny >= m {
continue
}
// xy ์ขํ ์ด๋ ์ ๋ฒฝ(0)์ ๋ง๋๋ฉด ์ด๋x
if maze[nx][ny] == 0 {
continue
}
// xy ์ขํ ์ด๋ ํ ํต๋ก(1)๋ฅผ ๋ง๋๋ฉด ์ด๋
if maze[nx][ny] == 1 {
maze[nx][ny] = maze[x][y] + 1
queue.append((nx, ny))
}
}
}
print(maze[n-1][m-1])
์์ ๊ฐ์ด ํ๋ฉด ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ ๋๋ง๋ค ์ด๋ ์ ์์น์ ๊ฐ+1์ ์ด๋ ํ ์์น์ ๊ฐ์ผ๋ก ํ ๋นํ๊ธฐ ๋๋ฌธ์, ๋ฏธ๋ก์ ์ขํ ๊ฐ์ ๋ชจ๋ ์ํ์ด ๋๋๊ณ ์๋์ ๊ฐ์ ๋ชจ์ต์ด ๋๋ค.
๋ฐ๋ผ์ ๋งจ ์ค๋ฅธ์ชฝ ์๋(์ถ๊ตฌ) ์ ๋๋ฌํ์ ๋์ ๊ฐ์ ์ถ๋ ฅํ๋ฉด ์ด๋ํ ์นธ์๊ฐ ๋๋ค(15).
[0, 0, 0, 0, 0], // ์ด๋ ์
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]
โฌ๏ธ
[3, 0, 9, 10, 11, 12], // ์ด๋ ํ
[2, 0, 8, 0, 12, 0],
[3, 0, 7, 0, 13, 14],
[4, 5, 6, 0, 14, 15]
BFS์ ํต์ฌ์ ํ์ ์์ ๋ชฉ๋ก์ ๋ฃ๊ณ , ํ๊ฐ ๋น ๋๊น์ง ํ์ฌ ์์น์ ์ฃผ๋ณ์ ํ์ํ๋ ๊ฒ์ธ ๊ฒ ๊ฐ๋ค.
์คํ์ DFS์ ๋ฌ๋ฆฌ ํ๋ฅผ ์ฐ๊ธฐ ๋๋ฌธ์, ํ์ ์ ๋ ฅ๋ ์์๋๋ก ์ด๋์ด ์ฒ๋ฆฌ๋๋ค.
'ํ๋ก๊ทธ๋๋ฐ > ์๊ณ ๋ฆฌ์ฆ ํ์ด Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค 10987] ๋ชจ์์ ๊ฐ์ (Swift) (0) | 2023.01.26 |
---|---|
[๋ฐฑ์ค 10811] ๋ฐ๊ตฌ๋ ๋ค์ง๊ธฐ (Swift) (0) | 2023.01.19 |
[Swift] DFS ์์ ์ ํ์ด (Softeer ์ฅ์ ๋ฌผ ์ธ์ ํ๋ก๊ทธ๋จ) (0) | 2023.01.16 |
[๋ฐฑ์ค 10539] ์๋น์ด์ ์์ด (Swift) (0) | 2023.01.11 |
[๋ฐฑ์ค 10101] ์ผ๊ฐํ ์ธ์ฐ๊ธฐ(Swift) (0) | 2022.12.14 |