MUKER_DEV with iOS

[swift] ๋ฐฑ์ค€ - 1520๋ฒˆ: ๋‚ด๋ฆฌ๋ง‰ ๊ธธ ๋ณธ๋ฌธ

๐Ÿค– ์•Œ๊ณ ๋ฆฌ์ฆ˜/BAEKJOON

[swift] ๋ฐฑ์ค€ - 1520๋ฒˆ: ๋‚ด๋ฆฌ๋ง‰ ๊ธธ

MUKER 2023. 3. 30. 23:21
 

1520๋ฒˆ: ๋‚ด๋ฆฌ๋ง‰ ๊ธธ

์ฒซ์งธ ์ค„์—๋Š” ์ง€๋„์˜ ์„ธ๋กœ์˜ ํฌ๊ธฐ M๊ณผ ๊ฐ€๋กœ์˜ ํฌ๊ธฐ N์ด ๋นˆ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค. ์ด์–ด ๋‹ค์Œ M๊ฐœ ์ค„์— ๊ฑธ์ณ ํ•œ ์ค„์— N๊ฐœ์”ฉ ์œ„์—์„œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ๊ฐ ์ง€์ ์˜ ๋†’์ด๊ฐ€ ๋นˆ ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค.

www.acmicpc.net


๋‚˜์˜ ํ’€์ด

struct Node { // r,c๋ฅผ ๋„˜๊ฒจ์ฃผ๊ธฐ ์œ„ํ•œ node
    var r: Int
    var c: Int
}
let MN = readLine()!.split(separator: " ").map { Int($0)! }
let M = MN[0] // ์„ธ๋กœ์˜ ํฌ๊ธฐ
let N = MN[1] // ๊ฐ€๋กœ์˜ ํฌ๊ธฐ
let rx = [0,0,-1,1] // x์ถ• ์ด๋™
let ry = [1,-1,0,0] // y์ถ• ์ด๋™
var map = [[Int]]()
var cnt = Array(repeating: Array(repeating: -1, count: N), count: M)
for _ in 0..<M {
    map.append(readLine()!.split(separator: " ").map { Int($0)! })
}

cnt[M-1][N-1] = 1 // DP๋Š” ๋ณดํ†ต ์ตœ์ดˆ ์ด๋‹ˆ์…œ๋ผ์ด์ง•์„ ํ•ด์ค˜์•ผ ํ•จ
_ = dfs(now: Node(r: 0, c: 0))
print(cnt[0][0])

func dfs(now: Node) -> Int {
    guard cnt[now.r][now.c] < 0 else { return cnt[now.r][now.c] } // ๋ฐฉ๋ฌธํ™•์ธ
    
    cnt[now.r][now.c] = 0 // ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ
    
    for i in 0..<4 {
        let nr = now.r + ry[i] // ์—ด ์ด๋™
        let nc = now.c + rx[i] // ํ–‰ ์ด๋™
        if nr < 0 || nc < 0 || nr >= M || nc >= N { // ๋งต ๋ฐ–์œผ๋กœ ๋‚˜๊ฐ€๋Š” ๊ฒฝ์šฐ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
            continue
        }
        if map[now.r][now.c] > map[nr][nc] {
            cnt[now.r][now.c] += dfs(now: Node(r: nr, c: nc))
            for i in cnt {
                print(i)
            }
            print("")
        }
    }
    return cnt[now.r][now.c]
}

ํ’€์ด ํ‚ค์›Œ๋“œ

DP
DFS

cnt ๋ฐฐ์—ด์˜ ํ๋ฆ„

[0, -1, -1, -1, -1]
[0, -1, -1, -1, -1]
[0, -1, -1, -1, -1]
[0, 0, 0, 1, 1]

[0, -1, -1, -1, -1]
[0, -1, -1, -1, -1]
[0, -1, -1, -1, -1]
[0, 0, 1, 1, 1]

[0, -1, -1, -1, -1]
[0, -1, -1, -1, -1]
[0, -1, -1, -1, -1]
[0, 1, 1, 1, 1]

[0, -1, -1, -1, -1]
[0, -1, -1, -1, -1]
[0, -1, -1, -1, -1]
[1, 1, 1, 1, 1]

[0, -1, -1, -1, -1]
[0, -1, -1, -1, -1]
[1, -1, -1, -1, -1]
[1, 1, 1, 1, 1]

[0, -1, -1, -1, -1]
[1, -1, -1, -1, -1]
[1, -1, -1, -1, -1]
[1, 1, 1, 1, 1]

[1, -1, -1, -1, -1]
[1, -1, -1, -1, -1]
[1, -1, -1, -1, -1]
[1, 1, 1, 1, 1]

[1, 0, 0, 0, -1]
[1, -1, -1, 0, -1]
[1, -1, -1, 1, -1]
[1, 1, 1, 1, 1]

[1, 0, 0, 0, -1]
[1, -1, -1, 1, -1]
[1, -1, -1, 1, -1]
[1, 1, 1, 1, 1]

[1, 0, 0, 1, -1]
[1, -1, -1, 1, -1]
[1, -1, -1, 1, -1]
[1, 1, 1, 1, 1]

[1, 0, 0, 1, 0]
[1, -1, -1, 1, 1]
[1, -1, -1, 1, -1]
[1, 1, 1, 1, 1]

[1, 0, 0, 1, 1]
[1, -1, -1, 1, 1]
[1, -1, -1, 1, -1]
[1, 1, 1, 1, 1]

[1, 0, 0, 2, 1]
[1, -1, -1, 1, 1]
[1, -1, -1, 1, -1]
[1, 1, 1, 1, 1]

[1, 0, 2, 2, 1]
[1, -1, -1, 1, 1]
[1, -1, -1, 1, -1]
[1, 1, 1, 1, 1]

[1, 2, 2, 2, 1]
[1, -1, -1, 1, 1]
[1, -1, -1, 1, -1]
[1, 1, 1, 1, 1]

[3, 2, 2, 2, 1]
[1, -1, -1, 1, 1]
[1, -1, -1, 1, -1]
[1, 1, 1, 1, 1]