‘쩰리’는 점프하는 것을 좋아하는 젤리다. 단순히 점프하는 것에 지루함을 느낀 ‘쩰리’는 새로운 점프 게임을 해보고 싶어 한다. 새로운 점프 게임의 조건은 다음과 같다.
새로운 게임이 맘에 든 ‘쩰리’는, 계속 게임을 진행해 마침내 최종 단계에 도달했다. 하지만, 게임을 진행하는 구역이 너무 넓어져버린 나머지, 이 게임에서 이길 수 있는지 없는지 가늠할 수 없어졌다. ‘쩰리’는 유능한 프로그래머인 당신에게 주어진 구역에서 승리할 수 있는 지 알아봐 달라고 부탁했다. ‘쩰리’를 도와 주어진 게임 구역에서 끝 점(오른쪽 맨 아래 칸)까지 도달할 수 있는지를 알아보자!
입력
입력의 첫 번째 줄에는 게임 구역의 크기 N (2 ≤ N ≤ 3)이 주어진다.
입력의 두 번째 줄부터 마지막 줄까지 게임판의 구역(맵)이 주어진다.
게임판의 승리 지점(오른쪽 맨 아래 칸)에는 -1이 쓰여있고, 나머지 칸에는 0 이상 100 이하의 정수가 쓰여있다.
출력
‘쩰리’가 끝 점에 도달할 수 있으면 “HaruHaru”(인용부호 없이), 도달할 수 없으면 “Hing” (인용부호 없이)을 한 줄에 출력합니다.
예제 입력 1
3
1 1 10
1 5 1
2 2 -1
예제 출력 1
HaruHaru
예제 입력 2
3
2 2 1
2 2 2
1 2 -1
예제 출력 2
Hing
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().split('\n');
const N = +input[0]; // 게임 구역 크기
let gameMap = []; // 게임판 구역
for (let i = 1; i <= N; i += 1) gameMap.push(input[i].split(' ').map(Number));
// 오른쪽, 아래 방향
const dx = [1, 0];
const dy = [0, 1];
let result = 'Hing'; // 끝점에 도달할 수 없는 경우 출력 메시지 담기
const dfs = (x, y, pos) => {
if (pos === 0) return; // 끝점에 도달하지 않았는데 더이상 이동할 수 없을 때 리턴
for (let i = 0; i < 2; i += 1) {
const [nx, ny] = [x + dx[i] * pos, y + dy[i] * pos]; // 다음 영역으로 이동
if (nx < 0 || nx >= N || ny < 0 || ny >= N) continue; // 영역 벗어나면 패스
// 끝점(-1)에 도달한 경우 결과에 끝점 도달 출력 메시지 담기
if (pos === -1) {
result = 'HaruHaru';
return; // 해당 dfs 종료
}
dfs(nx, ny, gameMap[nx][ny]); // 다음 영역으로 이동
}
};
dfs(0, 0, gameMap[0][0]); // 시작점은 항상 (0,0)
console.log(result);