PS/BOJ
9019
easy16
2022. 4. 30. 23:26
DSRL
기존작성 코드:
숏코드와 비교했을 때, 개선할 점.
1. Op class 대신 ans 배열 사용
2. L,R 연산의 간소화 Register 배열 사용 없이 정수 연산으로만 가능.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static int N;
static boolean DBG = false;
static boolean[] visitied;
static int[] d = { 1000, 100, 10, 1 };
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
for (int t = 0; t < N; ++t) {
st = new StringTokenizer(br.readLine());
int in = Integer.parseInt(st.nextToken());
int out = Integer.parseInt(st.nextToken());
System.out.println(bfs(in, out));
}
}
private static String bfs(int in, int out) {
visitied = new boolean[10000];
Queue<Op> Q = new LinkedList<>();
Q.offer(new Op(in, ""));
while (!Q.isEmpty()) {
int size = Q.size();
for (int i = 0; i < size; ++i) {
Op op = Q.poll();
if (op.value == out) {
return op.history;
}
if( op.value < 0 || visitied[op.value] ) continue;
visitied[op.value]=true;
Q.offer(new Op(D(op.value), op.history + "D"));
Q.offer(new Op(S(op.value), op.history + "S"));
Q.offer(new Op(L(op.value), op.history + "L"));
Q.offer(new Op(R(op.value), op.history + "R"));
}
}
return "";
}
static int D(int value) {
return value * 2 % 10000;
}
static int S(int value) {
return (value == 0) ? 9999 : value - 1;
}
static int L(int value) {
int[] register = new int[4];
for (int i = 0; i < 4; i++) {
register[i] = value / d[i];
value %= d[i];
}
int tmp = register[0];
for (int i = 1; i < 4; i++) {
register[i - 1] = register[i];
}
register[3] = tmp;
int newNumber = 0;
for (int i = 0; i < 4; i++) {
newNumber += register[i] * d[i];
}
return newNumber;
}
static int R(int value) {
int[] register = new int[4];
for (int i = 0; i < 4; i++) {
register[i] = value / d[i];
value %= d[i];
}
int tmp = register[3];
for (int i = 2; i >= 0; i--) {
register[i + 1] = register[i];
}
register[0] = tmp;
int newNumber = 0;
for (int i = 0; i < 4; i++) {
newNumber += register[i] * d[i];
}
return newNumber;
}
}
class Op {
int value;
String history;
Op(int value, String history) {
this.value = value;
this.history = history;
}
}
참조한 숏코드 : https://www.acmicpc.net/source/14994855
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static int N;
static boolean DBG = false;
static boolean[] visitied;
static String[] ans;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
for (int t = 0; t < N; ++t) {
st = new StringTokenizer(br.readLine());
int in = Integer.parseInt(st.nextToken());
int out = Integer.parseInt(st.nextToken());
// test
/*
* System.out.println("D : "+ D(in)); System.out.println("S : "+ S(0));
* System.out.println("L : "+ L(in)); System.out.println("R : "+ R(in));
*/
;
System.out.println(bfs(in, out));
}
}
private static String bfs(int in, int out) {
visitied = new boolean[10000];
ans = new String[10000];
Queue<Integer> Q = new LinkedList<>();
Q.offer(in);
visitied[in] = true;
ans[in] = "";
while (!Q.isEmpty()) {
int size = Q.size();
for (int i = 0; i < size; ++i) {
int now = Q.poll();
if (now == out) {
return ans[now];
}
visitied[now] = true;
int next = D(now);
if (!visitied[next]) {
ans[next] = ans[now] + "D";
visitied[next] = true;
Q.offer(next);
}
next = S(now);
if (!visitied[next]) {
ans[next] = ans[now] + "S";
visitied[next] = true;
Q.offer(next);
}
next = L(now);
if (!visitied[next]) {
ans[next] = ans[now] + "L";
visitied[next] = true;
Q.offer(next);
}
next = R(now);
if (!visitied[next]) {
ans[next] = ans[now] + "R";
visitied[next] = true;
Q.offer(next);
}
}
}
return "";
}
static int D(int value) {
return value * 2 % 10000;
}
static int S(int value) {
return (value == 0) ? 9999 : value - 1;
}
static int L(int value) {
return (value % 1000) * 10 + value / 1000;
}
static int R(int value) {
return (value % 10) * 1000 + value / 10;
}
}