Baekjoon

14226 - 이모티콘

kjy0349 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);
    }
}