Algorithm/BOJ
백준 1937 욕심쟁이 판다
삼쓰 웅쓰
2021. 4. 19. 19:39
728x90
출처: www.acmicpc.net/problem/1937
분류: DP, DFS
접근방식
기본적인 DFS 접근 방식에 DP의 개념을 추가해서 풀 수 있는 문제였습니다.
한 점에서 갈 수 있는 최대 거리(판다의 생존 일 수)를 DFS를 통해 구해나가는 데, 어차피 그 점에서 시작한 결과는 어차피 어디서 와서 시작하든 같기 때문에 다시 탐색할 필요가 없다는 점을 이용합니다.
따라서 일 수를 기록하는 Map크기와 같은 DP를 채워나가면 해결할 수 있었습니다.
해결방법
import Foundation
typealias Point = (r: Int, c: Int)
let n = Int(readLine()!)!
var map = [[Int]]()
for _ in 0..<n {
map.append(readLine()!.split(separator: " ").map { Int(String($0))! })
}
var dpMap = [[Int]](repeating: [Int](repeating: 0, count: n), count: n)
var dr = [1, -1, 0, 0]
var dc = [0, 0, 1, -1]
func dfs(_ curr: Point) -> Int {
guard dpMap[curr.r][curr.c] == 0 else { return dpMap[curr.r][curr.c] }
dpMap[curr.r][curr.c] = 1
for d in 0..<4 where 0..<n ~= curr.r + dr[d] && 0..<n ~= curr.c + dc[d] {
let next = Point(curr.r + dr[d], curr.c + dc[d])
guard map[next.r][next.c] > map[curr.r][curr.c] else { continue }
dpMap[curr.r][curr.c] = max(dpMap[curr.r][curr.c], dfs(next) + 1)
}
return dpMap[curr.r][curr.c]
}
var maxLife = 0
for r in 0..<n {
for c in 0..<n {
maxLife = max(maxLife, dfs((r, c)))
}
}
print(maxLife)
배운점
전에 비슷한 문제를 풀어봐서 개념은 어렵지 않았는데 역시 구현이 술술 되지는 않았다..