Game Develop

[Algorithm] Baekjoon 1038번 : 감소하는 수 본문

Algorithm/Baekjoon

[Algorithm] Baekjoon 1038번 : 감소하는 수

MaxLevel 2023. 10. 31. 04:05

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

 

1038번: 감소하는 수

음이 아닌 정수 X의 자릿수가 가장 큰 자릿수부터 작은 자릿수까지 감소한다면, 그 수를 감소하는 수라고 한다. 예를 들어, 321과 950은 감소하는 수지만, 322와 958은 아니다. N번째 감소하는 수를

www.acmicpc.net

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
 
int n;
string s = "";
int standardDepth = 0;
int answerCount = -1;
 
void DFS(int depth)
{
    if (depth == standardDepth)
    {
        ++answerCount;
 
        if (answerCount == n)
        {
            cout << s;
            exit(0);
        }
 
        return;
    }
 
    int prevNum = s.back() - '0';
 
    for (int i = 0; i <= 9++i)
    {
        if (i >= prevNum) continue;
 
        s.push_back(i + '0');
        DFS(depth + 1);
        s.pop_back();
    }
}
 
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
 
    cin >> n;
 
    for (int i = 1; i <= 10++i) // 뎁스설정
    {
        standardDepth = i;
 
        for (int j = 0; j <= 9++j)
        {
            s.push_back(j + '0');
            DFS(1);
            s.pop_back();
        }
    }
 
    cout << -1;
}
 
cs

어렵지않은 문젠데 문제이해를 이상하게 했었다...

일단 숫자자체는 감소하는 수이면서 오름차순으로 순번이 매겨지는건데, 오름차순인걸 망각하고 이상하게 순번매겼다.

 

숫자는 0~9로 총 최대숫자의개수는 10개다. 9876543210 인 경우 10개가 되기 때문에 최대 10개가 맞다.

그래서 최대숫자개수를 1개~10로 기준을 맞춰놓고 DFS를 돌렸다.

각 탐색마다 0~9를 숫자를 표현하는 string에 붙이는데, 이전숫자보다 작아야만 붙일 수 있다(감소하는 수니까).

이런식으로 완전탐색 돌리면 된다.