1520 - 내리막길 (java)

Byung Seon Kang·2022년 11월 22일

코드

import java.io.*;
import java.util.*;

/**
 * @Author: kbs
 */
public class Main {
    static int M,N;
    static int[] dx = {-1,0,1,0};
    static int[] dy = {0,1,0,-1};
    static int[][] arr;
    static boolean[][] visit;
    static int[][] memo;

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

        arr = new int[M][N];
        visit = new boolean[M][N];
        memo = new int[M][N];

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

        visit[0][0] = true;
        memo[M-1][N-1] = 1;
        int result = dfs(0, 0);

        System.out.println(result);
    }

    private static int dfs(int y, int x) {
        if(y==M-1 && x==N-1) {
            return 1;
        }



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

            if(ny>=M || ny<0 || nx>=N || nx<0 || arr[ny][nx]>=arr[y][x]) continue;

            if(visit[ny][nx]) {
                memo[y][x] += memo[ny][nx];
            }else {
                visit[ny][nx] = true;
                memo[y][x] += dfs(ny,nx);
            }
        }

        return memo[y][x];
    }
}
  • 굳이 visit 배열 안쓰고 그냥 dp배열 -1로 초기화 해놓고 -1 아닌 경우 dp 반환하도록 하는 것이 편할 듯합니다.
    • dp[M-1][N-1]을 1로 설정하지 않아서 다른 경로에서 방문한 경우 0을 반환하는 오류가 발생해 틀렸었다.
profile
왜 필요한지 질문하기

0개의 댓글