BOJ 14226: 이모티콘 https://www.acmicpc.net/problem/14226
BFS
를 사용한다.isVisited[클립 보드에 있는 갯수][화면에 보여지는 갯수]
Queue
에 담길 때마다 time + 1
을 해준다.import java.util.*;
import java.io.*;
public class Main {
static int S;
static boolean[][] isVisited = new boolean[1001][1001]; // [clipboard][total]
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
S = sc.nextInt();
sc.close();
bfs(S);
}
static void bfs(int target){
Queue<Imo> que = new LinkedList<>();
que.add(new Imo(0, 1, 0));
isVisited[0][1] = true;
while(!que.isEmpty()) {
Imo now = que.poll();
if(now.total == target) {
System.out.println(now.time);
return;
}
// 클립 보드에 저장
// 화면에 있던 이모티콘을 전부 클립 보드에 복사해 넣음
que.add(new Imo(now.total, now.total, now.time + 1));
// 클립 보드에 있는 이모티콘을 화면에 붙여넣기
// 클립 보드가 비어있지 않고 && 화면에 붙여넣은 후 개수가 총 개수보다 적어야 하고 && 아직 방문 안함
if(now.clipboard != 0 && now.total + now.clipboard <= target && !isVisited[now.clipboard][now.total + now.clipboard]) {
que.add(new Imo(now.clipboard, now.clipboard + now.total, now.time + 1));
isVisited[now.clipboard][now.total + now.clipboard] = true;
}
// 화면에서 이모티콘 하나 삭제
// 총 개수가 1 이상이고 && 아직 방문 안함
if(now.total >= 1 && !isVisited[now.clipboard][now.total - 1]) {
que.add(new Imo(now.clipboard, now.total - 1, now.time + 1));
isVisited[now.clipboard][now.total - 1] = true;
}
}
}
static class Imo{
int clipboard;
int total;
int time;
Imo(int clipboard, int total, int time){
this.clipboard = clipboard;
this.total = total;
this.time = time;
}
}
}