- Today
- Total
개발하는 고라니
[백준] 1937번 : 욕심쟁이 판다 본문
# 문제
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);
}
}
'Programming > 백준' 카테고리의 다른 글
[백준] 18352번 : 특정 거리의 도시 찾기 (0) | 2021.02.04 |
---|---|
[백준] 11057번 : 오르막 수 (0) | 2021.02.04 |
[백준] 5719번 : 거의 최단 경로 (0) | 2021.02.04 |
[백준] 4386번 : 별자리 만들기 (0) | 2021.02.03 |
[백준] 2573번 : 빙산 (0) | 2021.02.03 |