https://www.acmicpc.net/problem/9019
9019번: DSLR
네 개의 명령어 D, S, L, R 을 이용하는 간단한 계산기가 있다. 이 계산기에는 레지스터가 하나 있는데, 이 레지스터에는 0 이상 10,000 미만의 십진수를 저장할 수 있다. 각 명령어는 이 레지스터에
www.acmicpc.net
걸린 시간 : 1시간 4분
C++에서 Java로 옮기려고 하니까 쉬운 코드여도 실수가 엄청 잦고 코드도 깔끔하게 안 써진다...
처음엔 DP로 생각하고 풀려다가,, 그냥 BFS로 밀어버려도 되겠다고 생각해서 중간에 싹 바꿨다.
자료구조
- memo배열 : 해당 인덱스까지 오려면 어떤 연산을 거쳐야 하는지에 대한 String형 배열이다.
- vis배열 : 해당 인덱스에 방문했다면 더 이상 방문하면 안된다. 첫 방문이 제일 빠른 연산일테니까 말이다.
- q : 큐가 비어있지 않으면 도착지까지 방문하지 않았을 때 BFS를 반복한다.
정답 코드
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 BOJ9019 { static String[] operator = {"D", "S", "L", "R"}; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int T = Integer.parseInt(br.readLine()); while (T-- > 0) { StringTokenizer st = new StringTokenizer(br.readLine()); int a = Integer.parseInt(st.nextToken()); int b = Integer.parseInt(st.nextToken()); String[] memo = new String[10001]; boolean[] vis = new boolean[10001]; Queue<Integer> q = new LinkedList<>(); q.offer(a); memo[a] = ""; vis[a] = true; while (!q.isEmpty() && !vis[b]) { int cur = q.poll(); for (int k = 0; k < 4; k++) { int next; if (k == 0) next = (cur * 2) % 10000; else if (k == 1) next = (cur == 0) ? 9999 : cur - 1; else if (k == 2) next = (cur % 1000) * 10 + (cur / 1000); else next = (cur / 10) + (cur % 10) * 1000; if (!vis[next]) { vis[next] = true; memo[next] = memo[cur] + operator[k]; q.offer(next); } } } System.out.println(memo[b]); } } }
'Baekjoon Online Judge' 카테고리의 다른 글
[BOJ] 12015 : 가장 긴 증가하는 부분 수열 2 (C++) (1) | 2023.12.26 |
---|---|
[BOJ] 2805 : 나무 자르기 (C++) (1) | 2023.12.26 |
[BOJ] 14940 : 쉬운 최단거리 (Java) (0) | 2023.11.09 |
[BOJ] 2630 : 색종이 만들기 (Java) with 분할 정복 (1) | 2023.11.09 |
[BOJ] 1927 : 최소 힙 (Java) (0) | 2023.11.02 |