ALGORITHM/BOJ

[백준] 14226 이모티콘

0298 2022. 8. 15. 13:13

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

 

14226번: 이모티콘

영선이는 매우 기쁘기 때문에, 효빈이에게 스마일 이모티콘을 S개 보내려고 한다. 영선이는 이미 화면에 이모티콘 1개를 입력했다. 이제, 다음과 같은 3가지 연산만 사용해서 이모티콘을 S개 만

www.acmicpc.net

2022-08-15


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
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
 
public class Main14226 {
    static class Emoticon {
        int val;
        int copy;
 
        public Emoticon(int val, int copy) {
            this.val = val;
            this.copy = copy;
        }
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int S = sc.nextInt();
        Queue<Emoticon> q = new LinkedList<>();
        q.add(new Emoticon(10));
 
        int time = 0;
        boolean[][] vtd = new boolean[S*2+1][S*2+1];
        loop:while(!q.isEmpty()) {
            int size = q.size();
            while(size > 0) {
                Emoticon e = q.poll();
                if(e.val == S) break loop;
                if(!vtd[e.val][e.val]) {
                    q.add(new Emoticon(e.val, e.val)); // 1
                    vtd[e.val][e.val] = true;
                }
                if(e.val+e.copy <= S*2 && !vtd[e.val+e.copy][e.copy]) {
                    q.add(new Emoticon(e.val+e.copy, e.copy)); // 2
                    vtd[e.val+e.copy][e.copy] = true;
                }
                if(e.val-1 >= 2 && !vtd[e.val-1][e.copy]) {
                    q.add(new Emoticon(e.val-1, e.copy)); // 3
                    vtd[e.val-1][e.copy] = true;
                }
                size--;
            }
            time++;
        }
        System.out.println(time);
    }
}
cs

#문제풀이

아래 연산들은 모두 1초 씩이어서 한 케이스 당 3개의 연산들을 한 번씩 다 적용 했다. 

  1. 화면에 있는 이모티콘을 모두 복사해서 클립보드에 저장한다.
  2. 클립보드에 있는 모든 이모티콘을 화면에 붙여넣기 한다.
  3. 화면에 있는 이모티콘 중 하나를 삭제한다.

조건 중 S가 2 <= S <= 1000 이므로, visited를 체크하는 배열은 S*2+1로 잡았다.