문제 - https://www.acmicpc.net/problem/1520
1520번: 내리막 길
여행을 떠난 세준이는 지도를 하나 구하였다. 이 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다. 한 칸은 한 지점을 나타내는데 각 칸에는 그 지점의 높이가 쓰여 있으
www.acmicpc.net
import java.io.*;
import java.util.*;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
static StringTokenizer st;
static int M, N;
static int[] dr = {-1, 0, 1, 0};
static int[] dc = {0, 1, 0, -1};
static int[][] map, dp;
public static void main(String[] args) throws Exception {
st = new StringTokenizer(br.readLine());
M = Integer.parseInt(st.nextToken());
N = Integer.parseInt(st.nextToken());
map = new int[M][N];
dp = new int[M][N];
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < N; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
dp[i][j] = -1;
}
}
bw.write(dfs(0, 0)+"\n");
bw.flush();
bw.close();
br.close();
}
static int dfs(int r, int c){
if (r==M-1 && c==N-1) // 종료지점이면
return 1; // 1 리턴
else if (dp[r][c]<0){ // 방문한적 없으면
dp[r][c] = 0; // 0으로 초기화하고
for (int i = 0; i < 4; i++) { // 4방향 돌면서
int nr = r + dr[i];
int nc = c + dc[i];
if (0<=nr && nr<M && 0<=nc && nc<N && map[r][c]>map[nr][nc]) // 조건만족하면
dp[r][c] += dfs(nr, nc); // 값 추가
}
}
return dp[r][c]; // 갈 수 있는 경로수 리턴
}
}
단순 BFS, DFS로 2차례 시도했는데, 입력이 크지도 않은거 같은데 메모리초과가 나서 당황했다.
작은배열이더라도 메모리를 생각하는 습관을 들여야겠다!
'공부 > algorithm' 카테고리의 다른 글
BOJ 회의실 배정(1931) - Java (0) | 2021.10.25 |
---|---|
BOJ 쉬운 계단 수(10844) - Java (0) | 2021.10.23 |
BOJ RGB거리(1149) - Java (0) | 2021.10.20 |
BOJ 후보 추천하기(1713) - Java (0) | 2021.10.14 |
BOJ 가르침(1062) - Java (0) | 2021.10.13 |