[1937]욕심쟁이 판다

이준경·2022년 4월 14일
0
import java.util.*;
import java.io.*;

public class Main {
	static int N, map[][], dp[][], answer;
	static int idx[] = { 0, 0, -1, 1 };
	static int idy[] = { -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());
		map = 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++) {
				map[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				answer = Math.max(fn(i, j),answer);
			}
		}

		System.out.println(answer);
	}

	//큰 대나무에서 작은 대나무로 간다
	static int fn(int x, int y) {

		if(dp[x][y] !=0) return dp[x][y]; 
		dp[x][y] =1;
		for (int i = 0; i < 4; i++) {
			int sx = x + idx[i];
			int sy = y + idy[i];

			if (sx < 0 || sy < 0 || sx >= N || sy >= N || map[x][y] <= map[sx][sy])
				continue;
			dp[x][y] = Math.max(dp[x][y], fn(sx,sy)+1);
		}
		return dp[x][y];
	}

}

백준에선 정답이라 나오는데 특정 케이스에서 오버스택 에러남.
케이스


다른사람풀이

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

public class Main {
    static int N, ans;
    static int[][] map, memo;
    static int[] di = {-1, 1, 0, 0};
    static int[] dj = {0, 0, -1, 1};
    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        N = Integer.parseInt(in.readLine());
        map = new int[N][N];
        memo = new int[N][N];
        for(int i = 0 ; i < N ; i++) {
            st = new StringTokenizer(in.readLine(), " ");
            for(int j = 0 ; j < N ; j++) {
                map[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        for(int i = 0 ; i < N ; i++) {
            for(int j = 0 ; j < N ; j++) {
                if(memo[i][j] == 0) dfs(i, j);
            }
        }

        System.out.println(ans);
    }
    static void dfs(int i, int j) {
        int max = 0;
        for(int d = 0 ; d < 4 ; d++) {
            int ni = i + di[d];
            int nj = j + dj[d];
            if(ni < 0 || ni >= N || nj < 0 || nj >= N) continue;
            if(map[i][j] < map[ni][nj]) {
                if(memo[ni][nj] == 0) dfs(ni, nj);
                max = Math.max(memo[ni][nj], max);
            }
        }
        memo[i][j] = 1 + max;
        ans = Math.max(memo[i][j], ans);
    }
}

0개의 댓글

관련 채용 정보