백준 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);
}
}
총평
후기
개선할 점
없습니다.