[종만북] JUMPGAME 외발뛰기
동적계획법 말고도 다른 풀이가 있을 수 있음!
아래 코드는 8장 공부하면서 따라 친 것이므로 동적계획법 중 Top Down 방식에 해당함
import java.util.*;
import java.io.*;
public class Main{
static int n;
static int[][] d; // 끝지점까지 갈 수 있는지 여부를 저장할 변수
static int[][] map; // 주어진 지도를 저장
// DP - Top Down
static int jump(int i, int j){
// 지도를 벗어난 경우 -> 0 반환하며 종료
if( i >= n || j >= n ){
return 0;
}
// 끝 지점에 도달한 경우 -> 1 반환하며 종료
if( i == n-1 && j == n-1 ){
return 1;
}
// 메모이제이션 된 값이 있는지 체크 - 있다면 해당 값 반환
if(d[i][j] != -1 ){
return d[i][j];
}
// 메모이제이션 된 값이 없으므로 새로 구해준다.
// 오른쪽으로 진행한 경우 & 왼쪽으로 진행한 경우 둘 중 하나라도 1이면 가능하다
return d[i][j] = Math.max(jump(map[i][j]+i, j), jump(i, map[i][j]+j));
}
public static void main(String []args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
while(t-->0){
n = Integer.parseInt(br.readLine());
map = new int [n][n];
d = new int[n][n];
// 주어진 맵을 저장함과 동시에 d 에 초기값 -1로 설정
for(int i = 0 ; i < n ; i++ ){
StringTokenizer st = new StringTokenizer(br.readLine());
for(int j = 0 ; j < n ; j++){
map[i][j] = Integer.parseInt(st.nextToken());
d[i][j] = -1;
}
}
sb.append(jump(0, 0) == 1 ? "YES\n" : "NO\n");
}
System.out.println(sb);
}
}
Comments