Coding Test/Baekjoon

[C++] 백준 9019: DSLR

caez 2025. 5. 10. 16:54

안녕하세요 오늘 풀어볼 문제는 백준 DSLR 입니다.

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

 

저는 문제를 두 가지 작은 문제로 나누었어요.

1. 각 연산(DSLR)의 구현

2. 실제 연산을 수행하면서 최소한의 연산 횟수를 탐색

 

1. 각 연산(DSLR)의 구현

이 문제는 어렵지 않습니다.

// D
int d = (n * 2) % 10000;

// S
int s = (n - 1) >= 0 ? (n - 1) : 9999;

// L
int l = (n % 1000) * 10 + (n / 1000);

// R
int r = (n % 10) * 1000 + (n / 10);

 

2. 실제 연산을 수행하면서 최소한의 연산 횟수를 탐색

DFS로 접근을 해볼게요.

1000을 1로 만드는 경우는 'RRR'과 'L' 두 가지가 생각나네요.

1을 1000으로 만드는 경우는 'LLL'과 'R' 두 가지가 생각납니다.

 

연산의 우선순위를 어떻게 정의해야 할까요?

L과 R 사이에 상하 관계가 생긴다면 '최소한의 횟수'라는 조건을 만족할 수 없습니다.

D와 S도 마찬가지구요.

D, S와 L, R 간의 우선순위는 어떻게 정의해야 할까요?

 

이 문제는 BFS 문제입니다.

BFS 알고리즘은 큐에 삽입된 요소들의 크기가 오름차순임이 보장되기 때문에 '최소한'의 조건을 만족하겠네요.

우선순위를 고려할 필요도 없습니다.

 

BFS 흐름을 의사코드로 표현해볼게요.

while (queue is not empty) {
	if (current number equals to B) {
    	print current operators;
    }
    
	for (each operators in DSLR) {
    	tmp = operator(current number)
    	if (tmp is never visited) {
        	push tmp in queue;
            check tmp is visited;
        }
    }
}

 

 

아래는 코드 전문

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

int T;
bool visited[10001];

int main() {
	cin.tie(NULL); cout.tie(NULL); ios_base::sync_with_stdio(false);

	cin >> T;

	while (T--) {
		memset(visited, false, sizeof(visited));
		queue<pair<int, string>> q;
		
		int A, B;
		cin >> A >> B;
		
		q.push({ A,"" });
		visited[A] = true;

		while (!q.empty()) {
			auto p = q.front(); q.pop();
			int n = p.first;
			string cmd = p.second;

			if (n == B) {
				cout << cmd << '\n';
				break;
			}

			int t = (n * 2) % 10000;
			if (!visited[t]) {
				q.push({ t,cmd + 'D' });
				visited[t] = true;
			}

			t = (n - 1) >= 0 ? (n - 1) : 9999;
			if (!visited[t]) {
				q.push({ t,cmd + 'S' });
				visited[t] = true;
			}

			t = (n % 1000) * 10 + (n / 1000);
			if (!visited[t]) {
				q.push({ t,cmd + 'L' });
				visited[t] = true;
			}

			t = (n % 10) * 1000 + (n / 10);
			if (!visited[t]) {
				q.push({ t,cmd + 'R' });
				visited[t] = true;
			}
		}
	}
}

 

'Coding Test > Baekjoon' 카테고리의 다른 글

[C++] 백준 9465: 스티커  (0) 2025.05.12
[C++] 백준 14500: 테트로미노  (0) 2025.05.10
[C++] 백준 30804: 과일 탕후루  (0) 2025.05.01
[C++] 백준 18111: 마인크래프트  (2) 2025.04.30
[C++] 백준 1874: 스택 수열  (0) 2025.04.29