백준 16174 - 점프왕 쩰리 (Large)
Updated:
Java
16174 번 - 점프왕 쩰리 (Large)
문제
- ‘쩰리’는 가로와 세로의 칸 수가 같은 정사각형의 구역 내부에서만 움직일 수 있다. ‘쩰리’가 정사각형 구역의 외부로 나가는 경우엔 바닥으로 떨어져 즉시 게임에서 패배하게 된다.
 - ‘쩰리’의 출발점은 항상 정사각형의 가장 왼쪽, 가장 위의 칸이다. 다른 출발점에서는 출발하지 않는다.
 - ‘쩰리’가 이동 가능한 방향은 오른쪽과 아래 뿐이다. 위쪽과 왼쪽으로는 이동할 수 없다.
 - ‘쩰리’가 가장 오른쪽, 가장 아래 칸에 도달하는 순간, 그 즉시 ‘쩰리’의 승리로 게임은 종료된다.
 - ‘쩰리’가 한 번에 이동할 수 있는 칸의 수는, 현재 밟고 있는 칸에 쓰여 있는 수 만큼이다. 칸에 쓰여 있는 수 초과나 그 미만으로 이동할 수 없다.
 
‘쩰리’를 도와 주어진 게임 구역에서 끝 점(오른쪽 맨 아래 칸)까지 도달할 수 있는지를 알아보자!
접근 방법
젤리의 정보 (행, 열, 현재 점프할 수 있는 거리)를 저장할 객체를 선언한다.
BFS를 사용하기로 하여, 점프할 젤리들의 정보를 담을 Queue를 선언하였다.
젤리 하나를 poll한 다음, 오른쪽 / 아래를 탐색하여 거리 만큼 점프를 하여 갈 수 있으면 해당 위치와 그 위치의 거리 값을 queue에 넣어 다음에 점프할 젤리로 저장한다.
bfs를 반복하다, 만약 위치하는 지점에 도달하면 HaruHaru를 리턴
코드
import java.util.*;
import java.io.*;
public class Main {
	static int n, result;
	static int[][] map;
	static boolean[][] vis;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	StringTokenizer stk;
    	n = stoi(br.readLine());
    	
    	map = new int[n][n];
    	vis = new boolean[n][n];
    	
    	for(int i = 0; i < n; i++) {
    		stk = new StringTokenizer(br.readLine());
    		for(int j = 0; j < n; j++) {
    			map[i][j] = stoi(stk.nextToken());
    		}
    	}
    	
    	boolean isArrived = false;
    	
		// ---------------- BFS 시작 ---------------
    	int[] dy = {1,0};
    	int[] dx = {0,1};
    	
    	Queue<Jelly> queue = new LinkedList<>();
    	queue.add(new Jelly(0, 0, map[0][0]));
    	
    	Jelly j;
    	int y, x, v, ny, nx;
    	end : while(!queue.isEmpty()) {
    		j = queue.poll();
    		y = j.y;
    		x = j.x;
    		v = j.v;
    		
    		for(int i = 0; i < 2; i++) {
    			ny = y + v * dy[i];
    			nx = x + v * dx[i];
    			// 목표한 위치에 도달 했으면
    			if(isIn(ny, nx) && map[ny][nx] == -1) {
    				isArrived = true;
    				break end;
    			}
    			// 방문하지 않았으며, map 안에 있으면
    			if(isIn(ny, nx) && !vis[ny][nx]) {
    				vis[ny][nx] = true;
    				queue.add(new Jelly(ny,nx,map[ny][nx]));
    			}
    		}
    	}
		// ---------------- BFS 끝 ---------------
		
    	if(isArrived)
    		System.out.println("HaruHaru");
    	else
    		System.out.println("Hing");
    	br.close();
	}
	static class Jelly{
		int y,x,v;
		public Jelly(int y, int x, int v) {
			super();
			this.y = y;
			this.x = x;
			this.v = v;
		}		
	}
	
	// 주어진 범위 안에 있는가
    public static boolean isIn(int y, int x){
        if(y < 0 || y >= n || x < 0 || x >= n)
            return false;
        return true;
    }
	
	static int stoi(String str) {
    	return Integer.parseInt(str);
    }
}
총평
후기
개선할 점
없습니다.
