ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준]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

    '문제풀이 > 백준' 카테고리의 다른 글

    [백준]5972: 택배 배송 - JAVA  (0) 2021.05.24
    [백준]14719: 빗물 - JAVA  (0) 2021.05.21
    [백준]1013: Contact - JAVA  (0) 2021.05.19
    [백준]11779: 최소비용 구하기2 - JAVA  (0) 2021.05.17
    [백준]14226: 이모티콘 - JAVA  (1) 2021.05.16

    댓글

Designed by Tistory.