ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 14226 - 이모티콘
    Baekjoon 2022. 4. 20. 18:33

    2차원 탐색 문제이다.
    다른 탐색 문제들과는 조금 다른 점이 있는데, 클립보드에 어떤 값이 저장되어있냐에 따라서 다음 정점이 달라진다는 것이다.
    문제에서 나와있는 분기의 종류가 3가지이기 때문에 한 정점에서 3개의 간선이 뻗어나간다고 생각 할 수 있는데, 이것은 틀린 생각이다.
    1번째 2번째 분기는, 클립보드에 저장된 수에 따라서 각각 간선이 있다고 생각한 후 문제를 풀어야한다. 그래서 2차원 배열로 두고 풀면 쉽게 풀렸던 문제였다.
    vertex(이모티콘의 개수), clip(클립보드에 저장된 이모티콘의 개수) 두 값을 가지고 있는 클래스를 선언해준 후, 각각의 경우에 따라 분기를 돌 수 있도록 bfs를 이용해 문제를 풀이했다.
    MAX값이 2000인 이유는, S의 범위가 1000이고(아래 코드에서는 vertex) + 클립보드에 저장될 이모티콘의 개수는 S의 범위와 일치
    하므로, 최댓값이 2000정도 나온다고 생각하여 문제를 풀이했다.

    import java.io.*;
    import java.util.LinkedList;
    import java.util.Queue;
    
    class Vnc {
        int vertex;
        int clip;
        Vnc (int vertex, int clip) {
            this.vertex = vertex;
            this.clip = clip;
        }
    }
    
    public class Main {
        static int MAX = 2000;
    
        public static void bfs(int[][] map, boolean[][] visited) {
            Queue<Vnc> q = new LinkedList<>();
            q.add(new Vnc(1, 0));
            visited[1][0] = true;
            while (!q.isEmpty()) {
                Vnc cur = q.poll();
                int v = cur.vertex;
                int c = cur.clip;
                if (!visited[v][v]) {
                    visited[v][v] = true;
                    q.add(new Vnc(v, v));
                    map[v][v] = map[v][c] + 1;
                }
                if (v + c < MAX) {
                    if (!visited[v + c][c]) {
                        visited[v + c][c] = true;
                        q.add(new Vnc(v + c, c));
                        map[v + c][c] = map[v][c] + 1;
                    }
                }
                if (v - 1 >= 0) {
                    if (!visited[v - 1][c]) {
                        visited[v - 1][c] = true;
                        q.add(new Vnc(v - 1, c));
                        map[v - 1][c] = map[v][c] + 1;
                    }
                }
            }
        }
    
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            int S = Integer.parseInt(br.readLine());
            int[][] map = new int[MAX][MAX];
            boolean[][] visited = new boolean[MAX][MAX];
            bfs(map, visited);
            int min = 2147483647;
            for (int i = 0; i < map[S].length; i++) {
                if (min > map[S][i] && visited[S][i]) min = map[S][i];
            }
            System.out.println(min);
        }
    }
    
    

    'Baekjoon' 카테고리의 다른 글

    1261 - 알고 스팟  (0) 2022.04.22
    13549 - 숨바꼭질 3  (0) 2022.04.22
    7562 - 나이트의 이동  (0) 2022.04.20
    13913 - 숨바꼭질 4  (0) 2022.04.20
    1697 - 숨바꼭질  (0) 2022.04.19
Designed by Tistory.