[백준][C++] 9019-DSLR

2025. 5. 26. 22:35·알고리즘/문제풀이 :백준

📌문제 설명

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

 

💡생각

처음에 아무리 생각해도 해결방안이 생각나지 않아서 다른 분의 블로그를 읽는데 BFS라는 글자를 보고 번뜩 하면서 해결책이 생각났다!!!!!

 

  • 모든 경우의수를 다 구해야 하는건가?? -> 처음에 트리를 그려보면서 백트래킹으로 풀이를 해야할지에 대한 고민도 했었지만 너무 많은 수의 계산이 필요할 거 같아서 하지 않았다.
  • 그럼 어떻게 해야하지?? -> BFS??
  • 처음했던 생각을 백트래킹 말고 BFS를 이용해서 해야겠다고 판단했으면 참고를 하지 않아도 풀었을텐데 좀 아쉽다!!!

문제 풀이

  • 처음 입력받는 수를 Queue에 저장한다.
  • Queue는 어떤 계산을 통해 도달하게 되었는지 알아야 하기 때문에 pair를 통해 이전에 사용했던 계산을 저장하면서 Push해준다.
  • 만약 방문하지 않았다면 해당 값, 이전에 수행했던 연산 + 이번에 값을 만들기 위해 수행했던 연산을 더해줘서 pair형태로 저장한다.
  • 4개의 연산을 모두 수행하면 visited를 통해 이전에 방문했는지 계산하고 방문했었다면 Pass 아니면 연산 후 Push해준다.
  • 원하는 값을 찾는다면 반복문을 종료하고 출력한다.

🔥풀이

#include <iostream>
#include <queue>
using namespace std;

int shiftRight(const int num){
    int right_num = (num % 10) * 1000;
    int left_num = (num/10);
    return right_num + left_num;
}
int shiftLeft(const int num){
    int right_num = (num/1000);
    int left_num = (num%1000) * 10;
    return left_num + right_num;
}
int minusOne(const int num){
    int temp = num - 1;
    if(temp == -1){
        return 9999;
    }
    return temp;
}
int multiple(const int num){
    return (num*2) % 10000;
}
int main()
{
    int T;
    cin >> T;
    int start, distance;

    for(int i = 0; i < T; i++){
        cin >> start >> distance;
        bool visited[10001] = {false,};
        queue<pair<int,string> > q;
        q.push(make_pair(start, ""));
        visited[start] = true;
        while(!q.empty()){
            int fir = q.front().first;
            string sec = q.front().second;
            q.pop();
            if(fir == distance){
                cout << sec << "\n";
                break;
            }
            int firD = multiple(fir);
            int firS = minusOne(fir);
            int firL = shiftLeft(fir);
            int firR = shiftRight(fir);
            if(!visited[firD]){
                q.push(make_pair(firD, sec+"D"));
                visited[firD] = true;
            }
            if(!visited[firS]){
                q.push(make_pair(firS, sec+"S"));
                visited[firS] = true;
            }
            if(!visited[firL]){
                q.push(make_pair(firL, sec+"L"));
                visited[firL] = true;
            }
            if(!visited[firR]){
                q.push(make_pair(firR, sec+"R"));
                visited[firR] = true;
            }
        }
    }
}

참고

https://jangkunstory.tistory.com/126

 

[백준 / C++] 9019번: DSLR

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

jangkunstory.tistory.com

 

'알고리즘 > 문제풀이 :백준' 카테고리의 다른 글

[백준][C++] 1253 - 좋다  (0) 2025.07.07
[백준][C++] 2293 - 동전 1  (0) 2025.07.06
[백준][C++] 5430 - AC  (1) 2025.05.15
[백준][C++] 10972 - 다음 순열 (next_permutation)  (0) 2025.05.04
[백준][C++] 1270-땅따먹기  (1) 2025.05.04
'알고리즘/문제풀이 :백준' 카테고리의 다른 글
  • [백준][C++] 1253 - 좋다
  • [백준][C++] 2293 - 동전 1
  • [백준][C++] 5430 - AC
  • [백준][C++] 10972 - 다음 순열 (next_permutation)
각쿄
각쿄
  • 각쿄
    개발일기
    각쿄
  • 전체
    오늘
    어제
    • 분류 전체보기 (24)
      • 알고리즘 (13)
        • 문제풀이 : 프로그래머스 (0)
        • 문제풀이 :백준 (13)
        • 알고리즘 개념 (0)
      • 자료구조 (2)
      • 기초 (0)
        • 운영체제 (0)
        • 디자인패턴 (0)
        • 웹 (0)
        • 컴퓨터 네트워크 (0)
      • Spring (0)
      • IT이슈 (0)
      • 자바(Java) (5)
      • 에러(Error) (2)
        • Mysql (1)
      • 활동 (0)
        • 혼공학습단13기 - 혼자 공부하는 컴퓨터구조 운영.. (0)
      • 기능 구현! (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    mysql
    혼공학습단
    Stack
    스택
    Java
    이분탐색
    백준
    다이나믹 프로그래밍
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
각쿄
[백준][C++] 9019-DSLR
상단으로

티스토리툴바