백준 14395 - 4연산
Updated:
Java
14395 번 - 4연산
문제
접근 방법
연산을 통해 처음 도달한 값이, 최소 연산 횟수이므로 최단거리를 구하는 BFS를 사용한다.
비슷한 문제로는 백준 A → B이 있다.
코드
Main {
static int n, m, result;
static final int MAX = 1000000001;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stk = new StringTokenizer(br.readLine());
n = stoi(stk.nextToken());
m = stoi(stk.nextToken());
System.out.print(BFS(n,m));
br.close();
}
static String BFS(int start, int end) {
if(start == end)
return "0";
boolean[] vis = new boolean[MAX];
vis[start] = true;
Queue<Data> queue = new LinkedList<Data>();
queue.add(new Data(start, ""));
long curN, nextN;
int idx;
String curS;
Data data;
while(!queue.isEmpty()) {
data = queue.poll();
curN = data.getCurN();
curS = data.getStr();
if(curN == end) {
return curS;
}
// 3. s = s * s; (출력: *)
nextN = curN * curN;
if(isIn(nextN)) {
idx = (int) nextN;
if(!vis[idx]) {
vis[idx] = true;
queue.add(new Data(nextN, curS.concat("*")));
}
}
// 1. s = s + s; (출력: +)
nextN = curN * 2;
if(isIn(nextN)) {
idx = (int) nextN;
if(!vis[idx]) {
vis[idx] = true;
queue.add(new Data(nextN, curS.concat("+")));
}
}
// 2. s = s - s; (출력: -)
idx = 0;
if(!vis[idx]) {
vis[idx] = true;
queue.add(new Data(idx, curS.concat("-")));
}
// 4. s = s / s; (출력: /) (s가 0이 아닐때만 사용 가능)
if(curN != 0) {
idx = 1;
if(!vis[idx]) {
vis[idx] = true;
queue.add(new Data(idx, curS.concat("/")));
}
}
}
return "-1";
}
static class Data {
long curN;
String str;
Data(long num, String s){
curN = num;
str = s;
}
public String getStr() {
return str;
}
public long getCurN() {
return curN;
}
}
// 주어진 범위 안에 있는가
public static boolean isIn(long y){
if(y < 0 || y >= MAX)
return false;
return true;
}
static int stoi(String str) {
return Integer.parseInt(str);
}
}