문제
‘쩰리’는 점프하는 것을 좋아하는 젤리다. 단순히 점프하는 것에 지루함을 느낀 ‘쩰리’는 새로운 점프 게임을 해보고 싶어 한다. 새로운 점프 게임의 조건은 다음과 같다.
- ‘쩰리’는 가로와 세로의 칸 수가 같은 정사각형의 구역 내부에서만 움직일 수 있다. ‘쩰리’가 정사각형 구역의 외부로 나가는 경우엔 바닥으로 떨어져 즉시 게임에서 패배하게 된다.
- ‘쩰리’의 출발점은 항상 정사각형의 가장 왼쪽, 가장 위의 칸이다. 다른 출발점에서는 출발하지 않는다.
- ‘쩰리’가 이동 가능한 방향은 오른쪽과 아래 뿐이다. 위쪽과 왼쪽으로는 이동할 수 없다.
- ‘쩰리’가 가장 오른쪽, 가장 아래 칸에 도달하는 순간, 그 즉시 ‘쩰리’의 승리로 게임은 종료된다.
- ‘쩰리’가 한 번에 이동할 수 있는 칸의 수는, 현재 밟고 있는 칸에 쓰여 있는 수 만큼이다. 칸에 쓰여 있는 수 초과나 그 미만으로 이동할 수 없다.
새로운 게임이 맘에 든 ‘쩰리’는, 계속 게임을 진행해 마침내 최종 단계에 도달했다. 하지만, 게임을 진행하는 구역이 너무 넓어져버린 나머지, 이 게임에서 이길 수 있는지 없는지 가늠할 수 없어졌다. ‘쩰리’는 유능한 프로그래머인 당신에게 주어진 구역에서 승리할 수 있는 지 알아봐 달라고 부탁했다. ‘쩰리’를 도와 주어진 게임 구역에서 끝 점(오른쪽 맨 아래 칸)까지 도달할 수 있는지를 알아보자!
입력
입력의 첫 번째 줄에는 게임 구역의 크기 N (2 ≤ N ≤ 64)이 주어진다.
입력의 두 번째 줄부터 마지막 줄까지 게임판의 구역(맵)이 주어진다.
게임판의 승리 지점(오른쪽 맨 아래 칸)에는 -1이 쓰여있고, 나머지 칸에는 0 이상 100 이하의 정수가 쓰여있다.
출력
‘쩰리’가 끝 점에 도달할 수 있으면 “HaruHaru”(인용부호 없이), 도달할 수 없으면 “Hing” (인용부호 없이)을 한 줄에 출력합니다.
💡 풀이
BFS를 이용한 미로찾기 문제와 매우 유사한 문제이다. 다만, 4방향을 확인하는 것이 아니라, 오른쪽 or 아래쪽으로만 이동할 수 있으며 각 칸에 적힌 숫자의 크기만큼 무조건 이동해야하기 때문에 이 조건을 적용시켜주면 해결이 가능하다.
package Graph;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
class Node16174{
int x, y;
int weight;
public Node16174(int x, int y, int weight) {
this.x = x;
this.y = y;
this.weight = weight;
}
}
public class Q16174 {
public static int N;
public static int[][] graph;
public static boolean[][] visited;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
N = Integer.parseInt(br.readLine());
graph = new int[N][N];
visited = new boolean[N][N];
for(int i=0;i<N;++i){
st = new StringTokenizer(br.readLine());
for(int j=0;j<N;++j){
graph[i][j] = Integer.parseInt(st.nextToken());
}
}
findPath(0,0);
}
public static void findPath(int x, int y) {
Queue<Node16174> queue = new LinkedList<>();
queue.offer(new Node16174(x, y, graph[x][y]));
while (!queue.isEmpty()) {
Node16174 node = queue.poll();
x = node.x;
y = node.y;
int w = node.weight;
//도착점에 도달했을 경우
if (w == -1) {
System.out.println("HaruHaru");
return;
}
//주어진 그래프의 범위를 벗어날 경우
if (x + w >= N && y + w>= N)
continue;
//이동할 수 있는 경우, Queue에 넣기
if(x + w < N && !visited[x+w][y]) {
queue.offer(new Node16174(x + w, y, graph[x + w][y]));
visited[x+w][y] = true;
}
if(y + w < N && !visited[x][y+w]) {
queue.offer(new Node16174(x, y + w, graph[x][y + w]));
visited[x][y+ w] = true;
}
}
//Queue에 있는 모든 지점을 방문했음에도 도착점에 도착하지 못한 경우
System.out.println("Hing");
}
}
'알고리즘 > BOJ' 카테고리의 다른 글
[BOJ] 15900 : 나무 탈출(Java) (1) | 2022.11.17 |
---|---|
[BOJ] 1987 : 알파벳(Java) (0) | 2022.11.17 |
[BOJ] 11000 : 강의실 배정(Java) (0) | 2022.10.06 |
[BOJ] 5052 : 전화번호 목록(Java) (0) | 2022.10.01 |
[BOJ] 9657 : 돌 게임3(Java) (0) | 2022.09.05 |