이번에 풀어본 문제는
백준 9019번 DSLR 입니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
class Dslr
{
int n;
String cmd;
public Dslr(int n, String cmd)
{
this.n = n;
this.cmd = cmd;
}
}
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
StringTokenizer st;
StringBuilder sb = new StringBuilder();
while(t-- > 0)
{
st = new StringTokenizer(br.readLine());
int A = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());
Queue<Dslr> q = new LinkedList<>();
q.add(new Dslr(A,""));
boolean [] visited = new boolean[10000];
visited[A] = true;
while(!q.isEmpty())
{
Dslr cur = q.poll();
if(cur.n == B)
{
sb.append(cur.cmd).append("\n");
break;
}
for(int i = 0; i < 4; ++i)
{
Dslr next = calc(cur.n,i);
if(visited[next.n]) continue;
visited[next.n] = true;
q.add(new Dslr(next.n,cur.cmd+next.cmd));
}
}
}
System.out.print(sb);
}
static Dslr calc(int n, int cmd)
{
int res = n;
//D
if(cmd == 0)
{
res = (res * 2) % 10000;
return new Dslr(res,"D");
}
//S
else if(cmd == 1)
{
res = res == 0 ? 9999 : res-1;
return new Dslr(res,"S");
}
//L
else if(cmd == 2)
{
int tmp = (res % 1000) * 10;
tmp += (res / 1000);
return new Dslr(tmp,"L");
}
//R
else
{
int tmp = (res % 10) * 1000;
tmp += (res / 10);
return new Dslr(tmp,"R");
}
}
}
숫자 A를 숫자 B로 만들기 위한 최소횟수의 연산을 순차적으로 출력하는 문제입니다. 연산은 D,S,L,R 4가지가 있으며 연산에 대한 정보는 문제에서 확인하실 수 있습니다.
이 문제도 간단한 bfs로 해결할 수 있습니다. 먼저 시작값인 A를 큐에 담아주고, 큐에서 값을 꺼낼 때 마다 4가지 연산을 수행한 값을 큐에 다시 담아주면 됩니다. 같은 연산이 반복되지 않도록 방문배열을 활용해주면서, 큐에서 꺼낸 값이 B라면 즉시 반복을 벗어나, 진행했던 연산을 담아둔 문자열을 Stringbuilder에 추가해주면 됩니다.
L,R연산만 해결한다면 어렵지 않게 풀 수 있는 문제라고 생각합니다.