[백준] 9019번 DSLR

숫자A에서 숫자B로 변환하기 위해 필요한 최소한의 명령어 나열을 구하자!

bfs에 대한 개념을 잘 잡고 있다면 간단하게 풀 수 있다.

제출 후 정답율이 올라가는게 삐끄덕 거리면서 느려서 당황했지만 무사히 통과! ✧ʕ̢̣̣̣̣̩̩̩̩·͡˔·ོɁ̡̣̣̣̣̩̩̩̩✧

[문제 출처] 백준 9019번 : DSLR

풀이 방법

숫자와 문자열을 가진 Number클래스를 이용해 bfs를 수행한다.

  1. 큐에 숫자A를 넣고 시작한다.
  2. DSLR을 순차적으로 실행 후, 숫자를 비교하여 숫자B와 같을 경우 문자열을 반환한다.
  3. visit배열을 확인하여 나온적있는 숫자일 경우 continue
  4. 큐에 넣고 다음 사이클을 수행한다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main_G5_9019_DSLR {

	public static final int MAX = 10000;
	public static int numA, numB;
	public static boolean[] v;
	public static int[] A, B;
	public static char[] order = { 'D', 'S', 'L', 'R' };

	static class Number {
		int num;
		String str;

		public Number(int num, String str) {
			this.num = num;
			this.str = str;
		}
	}

	public static void main(String[] args) throws Exception {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;

		int T = Integer.parseInt(br.readLine());
		for (int tc = 1; tc <= T; tc++) {
			v = new boolean[MAX];

			st = new StringTokenizer(br.readLine());
			numA = Integer.parseInt(st.nextToken());
			numB = Integer.parseInt(st.nextToken());

			System.out.println(bfs());
		}
	}

	private static String bfs() {
		Queue<Number> que = new LinkedList<>();
		v[numA] = true;
		que.add(new Number(numA, ""));

		while (!que.isEmpty()) {
			Number cur = que.poll();
			for (int i = 0; i < 4; i++) {
				int num = changeNumber(cur.num, i);
				if (num == numB) return cur.str+order[i];
				
				if (v[num]) continue;
				que.add(new Number(num, cur.str+order[i]));
				v[num] = true;
			}
		}
		return "";
	}

	private static int changeNumber(int cur, int idx) {
		int num = 0;
		int n, tmp;
		switch (idx) {
		case 0:
			num = (cur * 2) % MAX;
			break;
		case 1:
			num = cur - 1;
			if (num < 0)
				num = 9999;
			break;
		case 2:
			n = cur / 1000;
			tmp = cur % 1000;
			num = tmp*10 + n;
			break;
		case 3:
			n = cur % 10;
			tmp = cur / 10;
			num = tmp + n * 1000;
			break;
		}
		return num;
	}
}

시간제한 메모리 제한 시간 메모리 레벨 풀이 당시 정답율
6초 256MB 2708ms 365824KB 골드 5 22.56%

댓글남기기