2021. 5. 31. 18:33ใ๐ง๐ป๐ป iOS ๊ฐ๋ฐ/Swift - Algorithm - Solutions
๐ต๐ป ๋ฌธ์ ํด์
๊ฑด์ค ํ์ฌ์ ํ๊ณ์ฌ์ธ ์ฃ ๋ฅด๋๋ ๊ณ ๊ฐ์ฌ๋ก๋ถํฐ ๊ฒฝ์ฃผ๋ก ๊ฑด์ค ๊ฒฌ์ ์๋ขฐ๋ฅผ ๋ฐ์์ต๋๋ค. ๊ณ ๊ฐ์ฌ๋ก ๋ฐ์ ๊ฒฝ์ฃผ๋ก ๊ฑด์ค ๋ถ์ง์ ์ ๋ณด๋ N X N์ ๊ฒฉ์ํํ์ด๋ฉฐ ์ค๊ฐ์ค๊ฐ ๋ฒฝ์ด ์ธ์์ ธ ์๋ ๋ถ๋ถ์ 1, ๋น์ด์๋ ๋ถ์ง๋ 0์ผ๋ก ๊ตฌ์ฑ๋์ด์์์ต๋๋ค.
๊ฒฝ์ฃผ๋ก์ ์์์ ์ (0, 0) , ๋ ์ ์ (N - 1, N - 1)์ด๋ผ๊ณ ํ ๋, ๋ฒฝ์ ํผํด ์ํ์ข์ฐ๋ก ํ ์นธ์ฉ ๋๋ก๋ฅผ ์ฐ๊ฒฐ ํ์ฌ ๊ฒฝ์ฃผ๋ก๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค. ๋๋ก๋ ์ธ์ ํ๊ณ ์๋ ๋น ๋ถ์ง 2๊ฐ๋ฅผ ์ฐ๊ฒฐํ์ฌ ๋ง๋ค๊ณ ์ฝ๋๋ฅผ ๋ง๋ค ๋๋ 500์, ์ง์ ๋๋ก๋ฅผ ๋ง๋ค ๋๋ 100์์ด ์ฌ์ฉ๋ฉ๋๋ค.
[์ ํ ์ฌํญ]
- board๋ 2์ฐจ์ ์ ์ฌ๊ฐ ๋ฐฐ์ด๋ก ๋ฐฐ์ด์ ํฌ๊ธฐ๋ 3 ์ด์ 25 ์ดํ์ ๋๋ค.
- board ๋ฐฐ์ด์ ๊ฐ ์์์ ๊ฐ์ 0 ๋๋ 1 ์
๋๋ค.
- ๋๋ฉด์ ๊ฐ์ฅ ์ผ์ชฝ ์๋จ ์ขํ๋ (0, 0)์ด๋ฉฐ, ๊ฐ์ฅ ์ฐ์ธก ํ๋จ ์ขํ๋ (N-1, N-1)์ ๋๋ค.
- ์์์ ๊ฐ 0์ ์นธ์ด ๋น์ด ์์ด ๋๋ก ์ฐ๊ฒฐ์ด ๊ฐ๋ฅํจ์ 1์ ์นธ์ด ๋ฒฝ์ผ๋ก ์ฑ์์ ธ ์์ด ๋๋ก ์ฐ๊ฒฐ์ด ๋ถ๊ฐ๋ฅํจ์ ๋ํ๋ ๋๋ค.
- board๋ ํญ์ ์ถ๋ฐ์ ์์ ๋์ฐฉ์ ๊น์ง ๊ฒฝ์ฃผ๋ก๋ฅผ ๊ฑด์คํ ์ ์๋ ํํ๋ก ์ฃผ์ด์ง๋๋ค.
- ์ถ๋ฐ์ ๊ณผ ๋์ฐฉ์ ์นธ์ ์์์ ๊ฐ์ ํญ์ 0์ผ๋ก ์ฃผ์ด์ง๋๋ค.
์ ๋ ๋จผ์ DFS ์๊ณ ๋ฆฌ์ฆ๊ณผ ํด๋น ์ขํ๊น์ง ์ฌ์ฉ๋๋ ์ต์ ๊ธ์ก์ ์ ์ฅํ 2์ฐจ์ ๋ฐฐ์ด์ ์ด์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ์ ๊ทผํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฝ๋๋ฅผ ์ฒดํฌํด์ฃผ๊ธฐ ์ํด ํด๋น ์ขํ๋ก ์ค๊ธฐ ์ ๋ฐฉํฅ์ ์ธ๋ฑ์ค๋ฅผ ์ ๋ฌ ์ธ์๋ก ์ฌ์ฉํ์ฌ ์ง์ ์ผ ๊ฒฝ์ฐ์ ๋ฐฉํฅ์ ๋ฐ๊ฟ ์ฝ๋๊ฐ ๋ง๋ค์ด์ง ๋๋ฅผ ๋๋์ด ์ฒ๋ฆฌํด๋ณด์์ต๋๋ค.
๐ฆ ๋ฌธ์ ํ์ด & ์ฝ๋
func solution(_ board:[[Int]]) -> Int {
let N = board.count
let dir = [[-1,0,1,0],[0,1,0,-1]]
// ์ขํ๊น์ง ๊ฒฝ์ฃผ๋ก๋ฅผ ๊ฑด์คํ ๋ ์ฌ์ฉ๋๋ ์ต์ cost ์ ์ฅ, Int.max๊ฐ์ผ๋ก ์ด๊ธฐํ
var costBoard = [[Int]](repeating: [Int](repeating: Int.max, count: N), count: N)
func isInside(_ r: Int, _ c: Int) -> Bool {
if r < 0 || r >= N || c < 0 || c >= N {
return false
}
return true
}
// dir: ํ์ฌ ์์น๋ก ์ค๊ฒ๋ ๋ฐฉํฅ ์ธ๋ฑ์ค
func dfs(_ cur: (r: Int, c: Int, cost: Int, dir: Int)) {
// ์ด๋ํ ๊ณณ์ด ๋ฒฝ์ด๊ฑฐ๋ ๋ฐฐ์ด์ ์ ์ฅ๋ ์ต์๊ฐ ๋ณด๋ค ํฐ ๊ฒฝ์ฐ ๋ฐ๋ก ๋ฆฌํด
if board[cur.r][cur.c] == 1 || cur.cost > costBoard[cur.r][cur.c] {
return
}
// ์ต์๊ฐ์ผ๋ก ๊ฐฑ์
costBoard[cur.r][cur.c] = cur.cost
// ์ํ์ข์ฐ๋ก ํ์
for idx in 0..<4 {
let nr = cur.r + dir[0][idx]
let nc = cur.c + dir[1][idx]
if isInside(nr, nc) {
// ์ง์ ๋ฐฉํฅ๊ณผ ๊ฐ์ ๊ฒฝ์ฐ, cost + 100
if cur.dir == idx {
dfs((r: nr, c: nc, cost: cur.cost + 100, idx))
} else {
// ๋ฐฉํฅ์ ๊บพ์ ๊ฒฝ์ฐ ์ฝ๋ + ์ง์ ๋๋ก๊ฐ ์๊ธฐ๋ฏ๋ก cost + (100 + 500)
dfs((r: nr, c: nc, cost: cur.cost + 600, idx))
}
}
}
}
// ์ถ๋ฐ์ cost 0์ผ๋ก ๊ฐฑ์
costBoard[0][0] = 0
// ์ถ๋ฐ์ ์์ ์ํ์ข์ฐ ์ค ํ, ์ฐ๋ฐฉํฅ๋ง ๊ฐ๋ฅํ๋ฏ๋ก ๋ ๋ฐฉํฅ์ผ๋ก dfs ํจ์ ํธ์ถ
dfs((r: 0, c: 1, cost: 100, dir: 1))
dfs((r: 1, c: 0, cost: 100, dir: 2))
// ๋์ฐฉ์ ์ต์๊ฐ ๋ฆฌํด
return costBoard[N - 1][N - 1]
}
'๐ง๐ปโ๐ป iOS ๊ฐ๋ฐ > Swift - Algorithm - Solutions' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift - ํ๋ก๊ทธ๋๋จธ์ค] ๋ค๋จ๊ณ ์นซ์ ํ๋งค (0) | 2021.06.02 |
---|---|
[Swift - ํ๋ก๊ทธ๋๋จธ์ค] ํฉ์น ํ์ ์๊ธ (0) | 2021.06.01 |
[Swift - ํ๋ก๊ทธ๋๋จธ์ค] ์ ๊ท ์์ด๋ ์ถ์ฒ (0) | 2021.05.31 |
[Swift - ํ๋ก๊ทธ๋๋จธ์ค] ์์ ๊ฒ์ (0) | 2021.05.29 |
[Swift - ํ๋ก๊ทธ๋๋จธ์ค] [3์ฐจ] ๋ฐฉ๊ธ๊ทธ๊ณก (0) | 2021.05.27 |