티스토리 뷰
문제
N×N 게임판에 수가 적혀져 있다. 이 게임의 목표는 가장 왼쪽 위 칸에서 가장 오른쪽 아래 칸으로 규칙에 맞게 점프를 해서 가는 것이다.
각 칸에 적혀있는 수는 현재 칸에서 갈 수 있는 거리를 의미한다. 반드시 오른쪽이나 아래쪽으로만 이동해야 한다. 0은 더 이상 진행을 막는 종착점이며, 항상 현재 칸에 적혀있는 수만큼 오른쪽이나 아래로 가야 한다. 한 번 점프를 할 때, 방향을 바꾸면 안 된다. 즉, 한 칸에서 오른쪽으로 점프를 하거나, 아래로 점프를 하는 두 경우만 존재한다.
가장 왼쪽 위 칸에서 가장 오른쪽 아래 칸으로 규칙에 맞게 이동할 수 있는 경로의 개수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 게임 판의 크기 N (4 ≤ N ≤ 100)이 주어진다. 그 다음 N개 줄에는 각 칸에 적혀져 있는 수가 N개씩 주어진다. 칸에 적혀있는 수는 0보다 크거나 같고, 9보다 작거나 같은 정수이며, 가장 오른쪽 아래 칸에는 항상 0이 주어진다.
출력
가장 왼쪽 위 칸에서 가장 오른쪽 아래 칸으로 문제의 규칙에 맞게 갈 수 있는 경로의 개수를 출력한다. 경로의 개수는 263-1보다 작거나 같다.
예제 입력 1 복사
4
2 3 3 1
1 2 1 3
1 2 3 1
3 1 1 0
예제 출력 1 복사
3
주의 메모리초과
4
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
이런 경우를 주의하기를 바란다!!!
문제해결
- 오른쪽, 아래 방향으로 주어진 지도에 숫자만큼 진행
- 지도 범위 안에 들면서 마지막 N-1, N-1 에 도착하면 경우의 수 추가
탑다운(Top-down)
풀이
더보기
import java.io.*;
import java.util.*;
public class Main {
static int N;
static int[][] arr;
static long[][] dp;
static int[] dx = {0, +1};
static int[] dy = {+1, 0};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
arr = new int[N][N];
for(int i=0; i<N; i++){
StringTokenizer st = new StringTokenizer(br.readLine());
for(int j=0; j<N; j++){
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
dp = new long[N][N];
for(int i=0; i<N; i++){
Arrays.fill(dp[i], -1);
}
long ans = go(0,0);
System.out.println(ans);
} // end main
static long go(int x, int y){
if (x == N-1 && y == N-1){
return 1;
}
if (arr[x][y] == 0) return 0;
if (dp[x][y] != -1) return dp[x][y];
int r = arr[x][y];
long tmp = 0;
for(int i=0; i<2; i++){
int nx = x + dx[i] * r;
int ny = y + dy[i] * r;
if (nx >= 0 && nx < N && ny >= 0 && ny < N){
tmp += go(nx, ny);
}
}
dp[x][y] = tmp;
return dp[x][y];
}
}
바텀업(Bottom-up)
풀이
더보기
import java.io.*;
import java.util.*;
public class Main {
static int N;
static int[][] arr;
static long[][] dp;
static int[] dx = {0, +1};
static int[] dy = {+1, 0};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
arr = new int[N][N];
for(int i=0; i<N; i++){
StringTokenizer st = new StringTokenizer(br.readLine());
for(int j=0; j<N; j++){
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
dp = new long[N][N];
dp[0][0] = 1;
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
int r = arr[i][j];
if (r == 0) break;
if (i+r < N)
dp[i+r][j] += dp[i][j];
if (j+r < N)
dp[i][j+r] += dp[i][j];
}
}
System.out.println(dp[N-1][N-1]);
} // end main
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 1학년 5557 문제풀이 탑다운DP (0) | 2024.07.17 |
---|---|
[백준] 4386 별자리 만들기 (0) | 2024.07.10 |
[백준] 2011 암호코드 (0) | 2024.07.10 |
백준 16928 뱀과 사다리 게임 자바 (0) | 2024.06.23 |
백준 14890 경사로 자바 문제풀이 (0) | 2024.06.19 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 투포인터
- 백준
- 유니온파인드
- 구현
- 오블완
- #스프링부트 자바버전 오류
- 조합
- 이진탐색
- 백준 경사로 자바
- dfs
- 바텀업
- dp
- BFS
- leetcode 1552
- 티스토리챌린지
- 탑다운dp
- 스프링부트3 자바 17 오류
- sql
- 백준 14890
- 탑다운
- 스프링부트3 java 버전오류
- 백준 14890 자바
- 백준 경사로
- 위상정렬
- 슬라이딩윈도우
- 백준 14890 경사로
- 1482
- 누적합
- 스프링부트3 자바 버전
- 스프링부트3
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
글 보관함