ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 1937 욕심쟁이 판다
    Algorithm/BOJ 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)

     

     

    배운점

    전에 비슷한 문제를 풀어봐서 개념은 어렵지 않았는데 역시 구현이 술술 되지는 않았다.. 

    'Algorithm > BOJ' 카테고리의 다른 글

    백준 2096 내려가기  (0) 2021.04.20
    백준 1915 가장 큰 정사각형  (0) 2021.04.19
    백준 1005 ACM Craft  (0) 2021.04.19
    백준 1238 파티  (0) 2021.04.19
    백준 16920 확장 게임  (0) 2021.04.09

    댓글

Designed by Tistory.