BOJ 14226 이모티콘
문제풀이
- class를 사용하여 두 가지 값을 가지고 있도록
- 2차원 visited를 사용한다.
- 현재 화면 상태가 같아도 클립보드 상태가 다르면 다음에 다른 결과를 가져올 수 있기 때문이다.
- BFS 함수 구현시 내부의 코드를 깔끔하게 작성하도록 노력해보자
구현코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
public class Main {
static class Node {
int cnt;
int clip;
public Node(int cnt, int clip) {
this.cnt = cnt;
this.clip = clip;
}
}
static boolean[][] visited;
static Queue<Node> q;
static int S;
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
S = Integer.parseInt(br.readLine());
visited = new boolean[1001][1001];
q = new LinkedList<>();
visited[1][0] = true;
q.offer(new Node(1, 0));
System.out.println(bfs());
}
private static int bfs() {
int time = 0;
while(!q.isEmpty()) {
int size = q.size();
time++;
for(int i = 0 ; i < size ; ++i) {
Node now = q.poll();
int[] temp = {now.cnt, now.cnt + now.clip, now.cnt - 1};
for(int j = 0 ; j < temp.length ; ++j) {
int next = temp[j];
if(next == S) return time;
switch(j) {
case 0:
if(next == 0) continue;
q.offer(new Node(next, next));
break;
case 1:
if(next > 1000 || visited[next][now.clip] || now.clip == 0) continue;
visited[next][now.clip] = true;
q.offer(new Node(next, now.clip));
break;
case 2:
if(visited[next][now.clip] || next == 0) continue;
visited[next][now.clip] = true;
q.offer(new Node(next, now.clip));
break;
}
}
}
}
return -1;
}
}