반응형
12-12 19:03
Today
Total
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
관리 메뉴

개발하는 고라니

[백준] 1937번 : 욕심쟁이 판다 본문

Programming/백준

[백준] 1937번 : 욕심쟁이 판다

조용한고라니 2021. 2. 4. 04:14
반응형
 

1937번: 욕심쟁이 판다

n*n의 크기의 대나무 숲이 있다. 욕심쟁이 판다는 어떤 지역에서 대나무를 먹기 시작한다. 그리고 그 곳의 대나무를 다 먹어 치우면 상, 하, 좌, 우 중 한 곳으로 이동을 한다. 그리고 또 그곳에서

www.acmicpc.net

# 문제

n*n의 크기의 대나무 숲이 있다. 욕심쟁이 판다는 어떤 지역에서 대나무를 먹기 시작한다. 그리고 그 곳의 대나무를 다 먹어 치우면 상, 하, 좌, 우 중 한 곳으로 이동을 한다. 그리고 또 그곳에서 대나무를 먹는다. 그런데 단 조건이 있다. 이 판다는 매우 욕심이 많아서 대나무를 먹고 자리를 옮기면 그 옮긴 지역에 그 전 지역보다 대나무가 많이 있어야 한다. 만약에 그런 지점이 없으면 이 판다는 불만을 가지고 단식 투쟁을 하다가 죽게 된다(-_-)

이 판다의 사육사는 이런 판다를 대나무 숲에 풀어 놓아야 하는데, 어떤 지점에 처음에 풀어 놓아야 하고, 어떤 곳으로 이동을 시켜야 둘 다 소중한 생명이지만 판다가 최대한 오래 살 수 있는지 고민에 빠져 있다. 우리의 임무는 이 사육사를 도와주는 것이다. n*n 크기의 대나무 숲이 주어져 있을 때, 이 판다가 최대한 오래 살려면 어떤 경로를 통하여 움직여야 하는지 구하여라.

# 입력

첫째 줄에 대나무 숲의 크기 n(1 ≤ n ≤ 500)이 주어진다. 그리고 둘째 줄부터 n+1번째 줄까지 대나무 숲의 정보가 주어진다. 대나무 숲의 정보는 공백을 사이로 두고 각 지역의 대나무의 양이 정수 값으로 주어진다. 대나무의 양은 1,000,000보다 작거나 같은 자연수이다.

# 출력

첫째 줄에는 판다가 최대한 살 수 있는 일수(K)를 출력한다.


[DFS + Dynamic Programming(DP)]

개인적으로 판다곰을 좋아하지만 이 문제를 풀며 정이 떨어졌다.

 

DP를 -1로 초기화 시켜놓았다. 1) 다음 정점이 범위를 만족하고, 2) 현재 정점보다 나무가 많은 곳임을 만족하는지 체크하고, DFS를 돌았다. 그리고 DFS를 호출했을 때 DP가 -1이 아니면 캐싱(Caching)하는 식으로  풀었다.

 

코드는 짧아 간단하나, 메모제이션에 대하여 더 공부가 필요함을 느낀 문제였다.

public class Main {

    static final int N = 501;
    static int[][] map = new int[N][N], dp = new int[N][N];
    static int[] Y = {-1, 1, 0, 0}, X = {0, 0, -1, 1};
    static int n, max = 1;

    static int DFS(int y, int x){

        if(dp[y][x] != -1)
            return dp[y][x];

        dp[y][x] = 1;

        for(int a=0; a<4; a++){
            int ny = y+Y[a];
            int nx = x+X[a];

            if((ny>0 && ny<=n) && (nx>0 && nx<=n) && map[ny][nx] > map[y][x]) {
                int value = 1;

                value += DFS(ny, nx);
                dp[y][x] = Math.max(value, dp[y][x]);
                
                max = Math.max(max, dp[y][x]);
            }
        }
        return dp[y][x];
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());

        for(int i=1; i<=n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            for(int j=1; j<=n; j++) {
                map[i][j] = Integer.parseInt(st.nextToken());
                dp[i][j] = -1;
            }
        }

        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
                if(dp[i][j] == -1)
                    DFS(i, j);

        System.out.println(max);
    }
}
반응형
Comments