[Java]BaekJoon.AC

[Java]백준 BaekJoon.AC 9019 : DSLR (Queue, Class 사용)

스뇨잉 2021. 10. 24. 01:17
728x90
728x90

 

https://www.acmicpc.net/problem/9019

 

9019번: DSLR

네 개의 명령어 D, S, L, R 을 이용하는 간단한 계산기가 있다. 이 계산기에는 레지스터가 하나 있는데, 이 레지스터에는 0 이상 10,000 미만의 십진수를 저장할 수 있다. 각 명령어는 이 레지스터에

www.acmicpc.net

 

 

 

 

(문제 이름이 DSLR이라 카메라 문제인 줄 알았는데... 이상한 계산기 문제였다..)

 

처음엔 TreeMap을 이용해 숫자와 나열을 저장하려 했다.

그런데 시간이 많이 걸릴 것 같기도 했고, visit 배열과 비교도 번거로웠다.

또한 bfs를 구현하고 싶었는데, 구현이 쉽지 않았다.

아무리 머리를 굴려도 각이 안서길래, 역시 첫발은 항상 틀리는ㄱ...

 

내게 이 문제가 어려웠던 이유는 이중 Class 사용에 서툴다는 것,

그 클래스를 (LinkedList에) 연결시켜야겠단 발상이 떠오르지 않는 것이다.

아직 어려움이 많다보니 뇌에서 애초에 접근하는 것조차 꺼려하는 것 같다...ㅋㅋ

*(중간에 시작한만큼 앞서 맞춘 문제들까지 차차 업로드해야겠다! 내 약점을 잘 파고든 좋은 문제들을 킵해뒀다)

 

아직 코드 정리가 고수처럼 깔끔하진 않은 것 같지만..

이 두가지 말곤 크게 괴로운 구석은 없었다.

역시 큰 틀과 알고리즘만 잘 셀렉한다면 곧잘 풀린다. 이게 가장 어려운 문제겠지만..

 

무튼 이번엔 큰 구성만 다른 코드를 참고하고 나머진 내가 구현했는데,

구성만 갖춘다면 거기서 거기인 문제라 다른 코드와 드라마틱한 차이는 없더라.

 

그래도 야무지게 잘 구현되니 좋은게 좋은 거다!

 

지난 문제서 System.out.print보다 StringBuilder 사용이 더 적합한 경우가 있음을 알게 됐는데, 여기서 적용해봤다.

줄곧 print만 썼던 탓에 익숙치 않아 손이 덜 갔는데.. 좋은 시도였다.

append 연속으로 쓰는 건 내 의지론 처음 해봤다. 굿

 

Queue<DSLR> queue

<>에 Integer나 String 말고 다른 아이들 넣을 수 있음을 항상 상기하기로 했다.

알고 있어도 아직까진 쉽게 떠오르지 않는다.

 

 

 

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 B;
	static boolean[] done;
	static StringBuilder sb = new StringBuilder();
	static Queue<DSLR> queue;
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	
		int T = Integer.parseInt(br.readLine());
		
		for(int i=0; i<T; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			done = new boolean[10000];
			queue = new LinkedList<>();
			
			int A = Integer.parseInt(st.nextToken());
			B = Integer.parseInt(st.nextToken());
			
			queue.add(new DSLR(A, ""));
			done[A] = true;
			
			devide();
			
		}
		
		System.out.print(sb.toString());
		
	}
	
	public static void devide() {
		
		int pol;
		
		while(true) {
			
			DSLR dslr = queue.poll();
			
			if(dslr.target == B) {
				sb.append(dslr.root).append("\n");
				return;
			}
			
			pol = dslr.D();
			if(done[pol]==false) {
				queue.add(new DSLR(pol, dslr.root + "D"));
				done[pol] = true;
			}
			
			pol = dslr.S();
			if(done[pol]==false) {
				queue.add(new DSLR(pol, dslr.root + "S"));
				done[pol] = true;
			}
			
			pol = dslr.L();
			if(done[pol]==false) {
				queue.add(new DSLR(pol, dslr.root + "L"));
				done[pol] = true;
			}
			
			pol = dslr.R();
			if(done[pol]==false) {
				queue.add(new DSLR(pol, dslr.root + "R"));
				done[pol] = true;
			}
			
		}

	}
	
}


class DSLR {
	int target;
	String root;
	int change;
	
	DSLR (int target, String root){
		this.target = target;
		this.root = root;
	}
	
	public int D(){
		change = (2 * target) % 10000;
		return change;	
	}
	
	public int S() {
		if(target==0) {
			change = 9999;
		}else {
			change = target - 1;
		}
		return change;
	}
	
	public int L() {
		int temp = target / 1000;
		change = (target % 1000) * 10;
		return change + temp;
	}
	
	public int R() {
		int temp = (target % 10) * 1000;
		change = target / 10;
		return change + temp;
	}
}
728x90
728x90