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;
}
}
'[Java]BaekJoon.AC' 카테고리의 다른 글
[Java]백준 BaekJoon.AC 13549 : 숨바꼭질3 (너비우선탐색-bfs, Queue) (0) | 2021.11.24 |
---|---|
[Java]백준 BaekJoon.AC 12865 : 평범한 배낭 (다이나믹 프로그래밍, knapsack) (0) | 2021.11.18 |
[Java]백준 BaekJoon.AC 12851 : 숨바꼭질2 (너비우선탐색-bfs, Queue) (0) | 2021.11.17 |
[Java]백준 BaekJoon.AC 9663 : N-Queen(브루트포스, 백트래킹) (0) | 2021.11.15 |
[Java]백준 BaekJoon.AC 9251 : LCS(다이나믹 프로그래밍 사용) (0) | 2021.11.11 |
[Java]백준 BaekJoon.AC 1916 : 최소비용 구하기(1753 최단경로+, 다익스트라 사용) (0) | 2021.11.06 |
[Java]백준 BaekJoon.AC 1753 : 최단경로 (다익스트라, 인접리스트 사용) (0) | 2021.11.03 |
[Java]백준 BaekJoon.AC 14500 : 테트로미노 (dfs, 노가다 사용) (0) | 2021.10.26 |