[BOJ]1937 - 욕심쟁이 판다 (G3)

suhyun·2023년 2월 21일
0

백준/프로그래머스

목록 보기
76/81

문제 링크

1937-욕심쟁이 판다


입력

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

출력

첫째 줄에는 판다가 이동할 수 있는 칸의 수의 최댓값을 출력한다.


문제 풀이

시간초과를 피하기위해 dp이용
dp[i][j]는 (i,j)를 시작점으로 했을 때의 판다가 이동할 수 있는 칸의 수의 최대값

즉, dp배열에 값을 저장해두고 maps의 모든 점을 돌면서 값이 가장 큰 것을 구하면 그게 바로 최종적으로 판다가 이동할 수 있는 칸의 수의 최대값
dp배열의 값이 0이 아니라면, 이미 dfs가 진행된 것이기 때문에 그 값을 그대로 리턴

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    static int n, result;
    static int[][] maps,dp;

    static int[] dx = {0, 0, -1, 1};
    static int[] dy = {1, -1, 0, 0};

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

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

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                result = Math.max(result, dfs(i, j));
            }
        }
        System.out.println(result);
    }

    public static int dfs(int x,int y) {
        if (dp[x][y] != 0) {
            return dp[x][y];
        }

        int day = 1;
        for (int i = 0; i < 4; i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];

            if (nx >= 0 && nx < n && ny >= 0 && ny < n) {
                if (maps[x][y] < maps[nx][ny]) {
                    day = Math.max(dfs(nx, ny) + 1, day);
                    dp[x][y] = day;
                }
            }
        }
        return day;
    }
}
profile
꾸준히 하려고 노력하는 편 💻

0개의 댓글