BOJ9019.java
// https://www.acmicpc.net/problem/9019
// 20.8.12. ventania1680
// BFS
package BOJ;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class BOJ9019 {
static boolean[] visited = new boolean[10001];
static String[] path = new String[10001];
static int f(int num, char c) {
switch (c) {
case 'D':
return (num * 2) % 10000;
case 'S':
return (num == 0) ? 9999 : --num;
case 'L':
return (num % 1000) * 10 + num / 1000;
case 'R':
return num / 10 + num % 10 * 1000;
}
return 0;
}
public static void solution() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
Queue<Integer> q = new LinkedList<>();
while (t-- > 0) {
StringTokenizer st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
Arrays.fill(path, "");
Arrays.fill(visited, false);
q.clear();
q.add(a);
visited[a] = true;
int parent = 0, cur = 0;
while (!q.isEmpty() && q.peek() != b) {
parent = q.peek();
cur = f(parent, 'D');
if (!visited[cur]) {
visited[cur] = true;
path[cur] = path[parent] + "D";
q.add(cur);
}
cur = f(parent, 'S');
if (!visited[cur]) {
visited[cur] = true;
path[cur] = path[parent] + "S";
q.add(cur);
}
cur = f(parent, 'L');
if (!visited[cur]) {
visited[cur] = true;
path[cur] = path[parent] + "L";
q.add(cur);
}
cur = f(parent, 'R');
if (!visited[cur]) {
visited[cur] = true;
path[cur] = path[parent] + "R";
q.add(cur);
}
q.poll();
}
sb.append(path[q.peek()] + "\n");
}
System.out.print(sb.toString());
}
}
BFS 알고리즘을 사용하는 문제.
visited 배열에 방문 여부 저장, path 배열에 해당 인덱스까지 경로(명령어) 저장.
Arrays.fill 메소드로 path, visited 배열을 초기화한다. (새로운 배열을 할당하면 메모리 초과 발생함)
큐 역시 메모리 초과를 방지하기 위해서 clear 메소드로 큐를 초기화한다.
https://www.acmicpc.net/problem/9019
9019번: DSLR
문제 네 개의 명령어 D, S, L, R 을 이용하는 간단한 계산기가 있다. 이 계산기에는 레지스터가 하나 있는데, 이 레지스터에는 0 이상 10,000 미만의 십진수를 저장할 수 있다. 각 명령어는 이 레지스�
www.acmicpc.net
ventania1680/algorithm
Contribute to ventania1680/algorithm development by creating an account on GitHub.
github.com
'Algorithm > BOJ' 카테고리의 다른 글
BOJ10026 / 적록색약 (0) | 2020.08.14 |
---|---|
BOJ9205 / 맥주 마시면서 걸어가기 (0) | 2020.08.13 |
BOJ6064 / 카잉 달력 (0) | 2020.08.11 |
BOJ1654 / 랜선 자르기 (0) | 2020.08.10 |
BOJ1436 / 영화감독 숌 (0) | 2020.08.08 |