문제풀이/백준

[백준]16174: 점프왕 쩰리 - JAVA

빈둥벤둥 2021. 5. 20. 11:20

[백준]16174: 점프왕 쩰리 

https://www.acmicpc.net/problem/16174

 

16174번: 점프왕 쩰리 (Large)

쩰리는 맨 왼쪽 위의 칸에서 출발해 (행, 열)로 나타낸 좌표계로,  (1, 1) -> (2, 1) -> (3, 1) -> (3, 3)으로 이동해 게임에서 승리할 수 있다.

www.acmicpc.net

풀이

약간 변형된 BFS문제로 탐색을 하면서 오른쪽, 아래 방향 중에서 이동할 수 있는 방향으로 점프할 수 있는 칸 만큼 점프하며 이동한다. 

 

최소 값을 구하는 것이 아니기 때문에 DFS, BFS, 브루트포스 등 다양하게 풀 수 있다. 이동할 수 있는 방향 만큼 이동할 수 있다면 큐에 담아 이동하도록 구현하였다.

 

한 번 이동할 때마다 점프를 해서 이동하기 때문에 중간에 방향을 바꿀 수 없다. 즉, 현재 위치에 입력된 보드의 숫자 만큼 왼쪽 또는 아래쪽으로만 이동할 수 있다는 말이다. 이를 구현하기 위해 좌표를 이동할 때 이동 위치에 board의 현재 값 만큼 곱해주었다.

 

만약 현재 위치가 -1이 된다면, 마지막 노드에 도착한 것이므로 ""HaruHaru"를 출력해 주었다. BFS탐색을 하는 동안 마지막 노드에 도착하지 못해 탐색이 종료되었다면 "Hing"을 출력해 주었다.

 

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import java.util.*;
 
public class Main {
    
    static int n;
    static int[][] board;
    static int[] dx = {01};
    static int[] dy = {10};
    static boolean[][] visited;
 
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        
        n = scan.nextInt();
        board = new int[n][n];
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < n; j++) {
                board[i][j] = scan.nextInt();
            }
        }
 
        visited = new boolean[n][n];
        bfs();
    }
 
    public static void bfs() {
        Queue<int[]> q = new LinkedList<>();
        visited[0][0= true;
        q.offer(new int[] {00});
        
        while(!q.isEmpty()) {
            int[] current = q.poll();
            int count = board[current[0]][current[1]];
 
            if(count == -1) {
                System.out.println("HaruHaru");
                return;
            }
 
            for(int i = 0; i < 2; i++) {
                int nx = current[0+ dx[i] * count;
                int ny = current[1+ dy[i] * count;
                if(nx >= 0 && ny >= 0 && nx < n && ny < n && visited[nx][ny] == false) {
                    visited[nx][ny] = true;
                    q.offer(new int[] {nx, ny});
                }
    
            }
        }
        System.out.println("Hing");
    }
}
 
cs