문제 출처 - Baekjoon Online Judge
문제는 여기
[문제]
‘쩰리’는 점프하는 것을 좋아하는 젤리다. 단순히 점프하는 것에 지루함을 느낀 ‘쩰리’는 새로운 점프 게임을 해보고 싶어 한다. 새로운 점프 게임의 조건은 다음과 같다.
- ‘쩰리’는 가로와 세로의 칸 수가 같은 정사각형의 구역 내부에서만 움직일 수 있다. ‘쩰리’가 정사각형 구역의 외부로 나가는 경우엔 바닥으로 떨어져 즉시 게임에서 패배하게 된다.
- ‘쩰리’의 출발점은 항상 정사각형의 가장 왼쪽, 가장 위의 칸이다. 다른 출발점에서는 출발하지 않는다.
- ‘쩰리’가 이동 가능한 방향은 오른쪽과 아래 뿐이다. 위쪽과 왼쪽으로는 이동할 수 없다.
- ‘쩰리’가 가장 오른쪽, 가장 아래 칸에 도달하는 순간, 그 즉시 ‘쩰리’의 승리로 게임은 종료된다.
- ‘쩰리’가 한 번에 이동할 수 있는 칸의 수는, 현재 밟고 있는 칸에 쓰여 있는 수 만큼이다. 칸에 쓰여 있는 수 초과나 그 미만으로 이동할 수 없다.
새로운 게임이 맘에 든 ‘쩰리’는, 계속 게임을 진행해 마침내 최종 단계에 도달했다. 하지만, 게임을 진행하는 구역이 너무 넓어져버린 나머지, 이 게임에서 이길 수 있는지 없는지 가늠할 수 없어졌다. ‘쩰리’는 유능한 프로그래머인 당신에게 주어진 구역에서 승리할 수 있는 지 알아봐 달라고 부탁했다. ‘쩰리’를 도와 주어진 게임 구역에서 끝 점(오른쪽 맨 아래 칸)까지 도달할 수 있는지를 알아보자!
[입력]
입력의 첫 번째 줄에는 게임 구역의 크기 N (2 ≤ N ≤ 64)이 주어진다.
입력의 두 번째 줄부터 마지막 줄까지 게임판의 구역(맵)이 주어진다.
게임판의 승리 지점(오른쪽 맨 아래 칸)에는 -1이 쓰여있고, 나머지 칸에는 0 이상 100 이하의 정수가 쓰여있다.
[출력]
‘쩰리’가 끝 점에 도달할 수 있으면 “HaruHaru”(인용부호 없이), 도달할 수 없으면 “Hing” (인용부호 없이)을 한 줄에 출력합니다.
[풀이]
1. 오른쪽, 아래로만 움직일 수 있으니 이를 담은 배열을 만들고, 위치를 나타낼 클래스를 만들어준다.
2. 값들을 입력받아준다.
3. BFS 탐색을 한다.
4. 이동해야하는 칸 수는 현재 위치에 적힌 발판의 수만큼이므로 이를 이용해서 이동 위치를 탐색한다.
5. -1이 적인 도착점에 도달할 수 있으면 HaruHaru, 아니라면 Hing을 출력하고 종료한다.
[접근]
1. BFS 를 사용하여 조건에 맞춰 결과를 출력하면 되겠다고 생각하였다.
2. 아래 문제와 똑같이 해결하였다.
[코드]
import java.io.*;
import java.util.*;
public class Main {
static int n;
static int map[][];
static boolean visited[][];
static int[] dr = {0, 1};
static int[] dc = {1, 0};
// 위치 클래스
static class point{
int x;
int y;
public point(int x, int y) {
this.x = x;
this.y = y;
}
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
map = new int[n][n];
visited = new boolean[n][n];
StringTokenizer st;
// 입력
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < n; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
// 탐색
bfs(0, 0);
}
public static void bfs(int x, int y) {
Queue<point> q = new LinkedList<>();
visited[x][y] = true;
q.add(new point(x, y));
while (!q.isEmpty()) {
point pos = q.poll();
// 도착지점에 도달하면
if (map[pos.x][pos.y] == -1) {
System.out.println("HaruHaru"); // 출력
return;
}
// 아래, 오른쪽 두 방향만 탐색
for (int i = 0; i < 2; i++) {
// map[pos.x][pos.y]을 곱하는 이유는 해당 칸의 숫자만큼 이동 가능
int nx = pos.x + dr[i] * map[pos.x][pos.y];
int ny = pos.y + dc[i] * map[pos.x][pos.y];
// 범위를 벗어나거나 이미 탐색한 곳이라면
if (nx < 0 || ny < 0 || nx >= n || ny >= n || visited[nx][ny])
continue;
visited[nx][ny] = true;
q.add(new point(nx, ny));
}
}
// 도착지점 도달 불가
System.out.println("Hing");
}
}
'문제 풀이 > Baekjoon' 카테고리의 다른 글
[백준] S1 18243번 Small World Network (JAVA) (0) | 2022.08.13 |
---|---|
[백준] S5 6159번 코스튬 파티 (JAVA) (0) | 2022.08.09 |
[백준] S1 14940번 쉬운 최단거리 (JAVA) (0) | 2022.07.31 |
[백준] G4 2617번 구슬 찾기 (JAVA) (0) | 2022.07.27 |
[백준] S2 14248번 점프 점프 (JAVA) (0) | 2022.07.24 |