0,0 에서 칸에 적힌 숫자만큼 아래 혹은 오른쪽으로 이동하여 마지막 칸까지 이동한다.
마지막 칸에 도착할 수 있다면 HaruHaru 없다면 Hing 출력
입력되는 2차원 배열을 저장한다.
스택<int [ ]>을 이용한 dfs로 풀어낸다. [0]은 x / [1]은 y 다.
visited[][]로 x,y를 방문하지 않았으면 목표지점인지 확인 후에
목표지점이 아니고 아래로 이동할수있으면 아래 이동한 지점을 stack에 넣는다.
오른쪽으로 이동할 수 있으면 stack에 넣는다.
목표지점이면 HaruHaru 출력 / 목표지점 없이 스택이 비면 Hing 출력
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(br.readLine());
int[][] arr = new int[n][n];
boolean[][] visited = new boolean[n][n];
boolean check = false;
// 배열 입력 받기
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < n; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
// ArrayDeque를 사용한 DFS 구현
ArrayDeque<int[]> deque = new ArrayDeque<>();
deque.addFirst(new int[] {0, 0});
while (!deque.isEmpty()) {
int[] current = deque.removeFirst();
int x = current[0];
int y = current[1];
if (visited[x][y]) continue; // 이미 방문한 위치는 건너뛰기
visited[x][y] = true;
if (arr[x][y] == -1) { // 목표 지점에 도착한 경우
check = true;
break;
}
// 아래로 이동 가능하면 deque에 추가
if (x + arr[x][y] < n) {
deque.addFirst(new int[] {x + arr[x][y], y});
}
// 오른쪽으로 이동 가능하면 deque에 추가
if (y + arr[x][y] < n) {
deque.addFirst(new int[] {x, y + arr[x][y]});
}
}
// 결과 출력
if (check) {
sb.append("HaruHaru");
} else {
sb.append("Hing");
}
System.out.print(sb.toString()); // StringBuilder 출력
}
}