โซ๏ธ ๋ฌธ์
https://school.programmers.co.kr/learn/courses/30/lessons/43163?language=swift
โซ๏ธ ๋์ ์๊ฐ์ ํ๋ฆ
์ผ๋จ ๋ช๋จ๊ณ์ ํ๋ฆ์ ๊ฑฐ์ณ์ผํ๋์ง , ๊ทธ๋ฆฌ๊ณ ์ด ํ๋ฆ์ด ์ต์๊ฐ ๋๋ ํด๋ฅผ ๊ตฌํด์ผํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ผ๋จ ๊ฐ์ฅ ๋จผ์ BFS๋ฅผ ๋ ์ฌ๋ ธ๋ค. ๊ทธ๋ผ BFS๋ฅผ ๊ตฌํํ๊ธฐ ์ ์ ์ด๊ฒ์ ๊ฒ ์๊ฐ์ ํด๋ณด์.
๐ ์๊ฐ๋ณต์ก๋
์กฐ๊ฑด์ ์ดํด๋ณด๊ณ ์๊ฐ๋ณต์ก๋๋ฅผ ์๊ฐํด๋ดค๋ค. BFS๋ฅผ ๊ตฌํํ๋ฉด ์ด N๋ฒ์ ๋ ธ๋์ ๋ฐฉ๋ฌธํ๊ณ , queue๊ฐ ๋น๋๊น์ง while๋ฌธ์ด ๋ฐ๋ณต๋๋ฏ๋ก O(n^2)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์์์ ํญ์ ๋งํ๋ฏ, BFS๋ queue์ ์ฑ๋ฅ์ด ๊ต์ฅํ ์ค์ํ๋ฐ, ๊ฐ์ฅ ์ข์ ๊ฑด O(1)์ง๋ฆฌ ํ๋ฅผ ๊ฐ๋ ๊ฒ์ด์ง๋ง, ๋ฒ์๊ฐ ํด๋ณผ๋งํ๋ค๋ฉด, ๊ณผ๊ฐํ๊ฒ removeFirst๋ฅผ ์จ๋ ์๊ฐ์ด๊ณผ๊ฐ ๋์ง ์๋๋ค. ์ง๊ธ ์ด ๊ฒฝ์ฐ๋ queue ๋ด๋ถ์ ๊ฐ์ฅ ๋ง์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ๋ 2500๊ฐ์ด๊ธฐ ๋๋ฌธ์ ๋ญ.. ๋์์ง ์๋ค๊ณ ์๊ฐํ๋ค. (์์ง์ ์ด์ ๋๋ก ์ถ์ธกํ๋ ์ ๋์ด์ง๋ง, ์กฐ๋ง๊ฐ ๋ ์์ธํ ์๊ฐ๋ณต์ก๋์ ๋ํด์ ๊ณต๋ถํ๊ณ ๊ธ์ ํฌ์คํ ํด๋ณด๊ฒ ๋ค! ๐๐ป)
๐ ๊ทธ๋ผ , BFS๋ก ๊ตฌํํด๋ณด๊ธฐ๋ก ํ๊ณ ์๋์ฝ๋๋ก ์์ฑํด๋ณด์.
์ผ๋จ BFS๋ ๋ด๊ฐ ์ํ๋ ๋ ธ๋๊น์ง ๋๋ฌํ๊ฒ ๋๋ฉด, ๋ฐ๋ก while๋ฌธ์ ํ์ถํ๊ณ ๊ทธ ๋ ธ๋๊น์ง ๊ฐ cost ๋ฅผ ์ถ๋ ฅํ๋ค. ์ด ๋ฐฉ์์ ์ด์ฉํ๊ณ ์ ํ๋ค. ๊ทธ๋ผ ์ฌ๊ธฐ์ ๋ญ๊ฐ ๋ ธ๋๊ฐ ๋ ๊น?
๋ฌธ์ ์ ์กฐ๊ฑด์ด, hit begin์ผ๋ก ์ฃผ์ด์ง๋ค๋ฉด 'ํ ์ํ๋ฒณ'์ด ๋ค๋ฅธ ๊ฒ์ด ๋ค์์ผ๋ก ์ฌ ์ ์๋ค. ์์ฌ 1๋ฒ์ ์์๋ก ๋ณด๋ฉด, hit ๋ค์์ผ๋ก๋ hot์ด ์ฌ ์ ์๊ฒ ์ง? ๊ทธ๋ฌ hit๊ณผ ์ธ์ ํ ๋ ธ๋๋ฅผ hot์ด๋ผ๊ณ ์๊ฐํ๊ณ hot์ ๋ค์ ํ์ ๋ฃ์ด์ค๋ค. ์ด๋ฐ์์ผ๋ก DFS๋ฅผ ๊ตฌํํ๋ฉด ๋์ง ์์๊น?
๋ฌธ์ ์ ์กฐ๊ฑด์์ 'ํ ๊ธ์๋ง ๋ฐ๊ฟ ์ ์๋ค'๋ผ๊ณ ํ ๊ฒ์, ๊ฒฐ๊ตญ ํ๊ธ์ ๋นผ๊ณ ์ํ๋ฒณ์ ์์น๋ ๋ชจ๋ ๊ฐ์์ผํ๋ค. hit ๊ณผ hot์ฒ๋ผ! ๊ทธ๋์ ์ด๋ ๊ฒ ํ๊ธ์๋ง ๋ค๋ฅธ ๊ฒ์ ๊ตฌ๋ณํด์ฃผ๋ ํจ์๋ฅผ ๋ฐ๋ก ๋ง๋ค์๋ค. (๊ฐ๋ ์ฑ์ ์ํด ๋ ธ๋ ฅํด๋ดค๋ค ^___^ ๐๐ป)
์ด ๋ฌธ์ ๋ฅผ ํ๋ฉด์ zip์ ์ฒ์ ์จ๋ดค๋๋ฐ, hit๊ณผ hot์ zip์ ์ด์ฉํ๊ฒ ๋๋ค๋ฉด, h-h, i-o, t-t ์ด๋ ๊ฒ ์ง์ง์ด์ loop๋ฅผ ๋ ์ ์๊ฒ ๋ง๋ค์ด์ค๋ค. ๋ณดํต for๋ฌธ์์ ๋ง์ด ์ฌ์ฉํ๋ค๊ณ ํ๋ค! ์ด์จ๋ ์ด zip์ ์ด์ฉํ๊ณ , filter๋ก ๋น๊ตํด์ฃผ์๋ค.
func canChange(word: String, changeWord: String) -> Bool {
if zip(word, changeWord).filter({ $0 != $1 }).count == 1 {
return true
}
return false
}
โซ๏ธ ์ ๋ต์ฝ๋
import Foundation
func solution(_ begin:String, _ target:String, _ words:[String]) -> Int {
if !words.contains(target) {
return 0
}
// bfs
var queue = [(String, Int)]()
queue.append((begin, 0))
while !queue.isEmpty {
let temp = queue.removeFirst()
let word = temp.0
let depth = temp.1
for w in words {
if canChange(word: word, changeWord: w) {
if w == target {
return depth + 1
} else {
queue.append((w, depth + 1))
}
}
}
}
return 0
}
func canChange(word: String, changeWord: String) -> Bool {
if zip(word, changeWord).filter({ $0 != $1 }).count == 1 {
return true
}
return false
}
'Algorithm > Baekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] (Swift) 10816๋ฒ - ์ซ์์นด๋2 (์ด๋ถํ์, upper bound, lower bound) (0) | 2023.03.17 |
---|---|
[๋ฐฑ์ค] (Swift) 1941๋ฒ - ์๋ฌธ๋ ์น ๊ณต์ฃผ (๊ณจ๋3) (DFS) (2) | 2023.03.04 |
[๋ฐฑ์ค] (Swift) 3055๋ฒ - ํ์ถ (๊ณจ๋4) (BFS) (0) | 2023.03.03 |
[๋ฐฑ์ค] (Swift) 10026๋ฒ - ์ ๋ก์์ฝ (๊ณจ๋5) (DFS) (0) | 2023.03.03 |
[๋ฐฑ์ค] (Swift) 14716๋ฒ - ํ์๋ง (์ค๋ฒ1, DFS) (0) | 2023.02.28 |