Algorithm/baekjoon

이모티콘

마닐라 2022. 2. 20. 17:46

📍 문제 설명

💡 접근

시간, 이모티콘의 갯수, 클립보드에 저장된 이모티콘 갯수를 저장해나간다.

방문처리를 할 때 현재 이모티콘 갯수와 클립보드의 갯수에 따라서 체크해줘야한다.

이미 처리된 부분이 나중에 계산된 부분한테 덮어씌워질 수 있다.

 

붙여넣기를 할 때 배열의 범위에 주의해야줘야 한다.

1.클립보드의 갯수가 n보다 크면 큐에 넣으면 안된다.

->계속 저장해서 클립보드에 저장하여 출력하는 경우 n인 부분에서 최솟값이 될거다.

2.1)과 마찬가지로 2000이 넘는 부분도 큐에 넣으면 안된다.

클립보드가 999일 때 이모티콘이 1000이면 그게 답이 될 수 있다.

 

👩‍💻 코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    static int n, m, v, e, k, answer, cnt;
    static int[] arr, dis = {-1, 1, 2};
    static long[] dp;
    static int[][] board;
    static boolean[][] visited;
    static int[] dx = {-1,1,0,0};
    static int[] dy = {0,0,-1,1};
    static ArrayList<Integer> list;
    static StringBuilder sb;
    static Queue<Integer> q;
    public static void main(String[] args) {
        Scanner kb = new Scanner(System.in);
        Main T = new Main();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        n = kb.nextInt();
        //이모티콘 갯수와 클립보드에 따른 탐색 여부 담는 배열
        visited = new boolean[1001][1001];
        T.solution();

    }


    private void solution() {
        Queue<Point> q = new LinkedList<>();
        q.offer(new Point(0, 1, 0));

        while(!q.isEmpty()) {
            int len = q.size();
            for(int i = 0; i < len; i++) {
                Point cp = q.poll();
                if(cp.emoticon == n) {
                    System.out.println(cp.second);
                    return;
                }

                //1.화면에 있는 이모티콘 모두 복사해서 클립보드에 저장
                q.offer(new Point(cp.second+1, cp.emoticon, cp.emoticon));
                //2.클립보드에 있는 모든 이모티콘을 화면에 붙여넣기 -> 갯수 증가
                if(cp.clipBoard > 0 && cp.emoticon+cp.clipBoard <= n && !visited[cp.emoticon+cp.clipBoard][cp.clipBoard]) {
                    visited[cp.emoticon+cp.clipBoard][cp.clipBoard] = true;
                    q.offer(new Point(cp.second+1, cp.emoticon+cp.clipBoard, cp.clipBoard));
                }
                //3.화면이 있는 이모티콘 중 하나를 삭제 -> 갯수 감소
                if(cp.emoticon > 0 && !visited[cp.emoticon-1][cp.clipBoard]) {
                    visited[cp.emoticon-1][cp.clipBoard] = true;
                    q.offer(new Point(cp.second + 1, cp.emoticon - 1, cp.clipBoard));
                }
            }
        }
    }

    private static class Point {
        private int second;
        private int emoticon;
        private int clipBoard;


        public Point(int second, int emotion, int clipBoard) {
            this.second = second;
            this.emoticon = emotion;
            this.clipBoard = clipBoard;
        }

        @Override
        public String toString() {
            return "Point{" +
                    "second=" + second +
                    ", emoticon=" + emoticon +
                    ", clipBoard=" + clipBoard +
                    "}";
        }
    }
}

'Algorithm > baekjoon' 카테고리의 다른 글

배열 돌리기 3  (0) 2022.02.20
알고스팟  (0) 2022.02.20
숨바꼭질 4  (0) 2022.02.20
숨바꼭질 3  (0) 2022.02.20
숨바꼭질 2  (0) 2022.02.19