https://www.acmicpc.net/problem/2529
2529번: 부등호
여러분은 제시된 부등호 관계를 만족하는 k+1 자리의 최대, 최소 정수를 첫째 줄과 둘째 줄에 각각 출력해야 한다. 단 아래 예(1)과 같이 첫 자리가 0인 경우도 정수에 포함되어야 한다. 모든 입력
www.acmicpc.net
10개의 수 중에서 K + 1개를 고른다 -> 순서를 모두 만든다 -> 부등호 검사
2 ^ 10 * 10 ! * 10 => 300억 경우의 수...
6 < 8 > 7 < 9
실제로 수는 중요하지않다! --> 2 ^ 10을 없앨 수 있다 이 말..
대소 관계만 중요하다
가장 큰 수 : 9 8 7 6
가장 작은 수 : 0 1 2 3
이렇게 되면 시간 복잡도는
(k + 1) ! * (k + 1)
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
57
58
59
60
61
62
63
64
65
66
|
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool check(vector<int> num, vector<char> a)
{
for (int i = 0; i < a.size(); i++)
{
if (a[i] == '>')
{
if (num[i] < num[i + 1])
return false;
}
if (a[i] == '<')
{
if (num[i] > num[i + 1])
return false;
}
}
return true;
}
int main()
{
int k;
cin >> k;
vector<char> a(k); // 부등호를 넣는다
for (int i = 0; i < k; i++)
{
cin >> a[i];
}
vector<int> small(k + 1); // 가장 작은 수
vector<int> big(k + 1); // 가장 큰 수
for (int i = 0; i <= k; i++)
{
small[i] = i;
big[i] = 9 - i;
}
//모든 순열을 구할 때는 do-while문을 씀
// 오름차순으로 가기 때문에
// small은 next_permutation
// big은 prev_permutation
do {
if (check(small, a))
break;
} while (next_permutation(small.begin(), small.end()));
do {
if (check(big, a))
break;
} while (prev_permutation(big.begin(), big.end()));
for (int i = 0; i < big.size(); i++)
cout << big[i];
cout << '\n';
for (int i = 0; i < small.size(); i++)
cout << small[i];
return 0;
}
|
cs |
'브루트 포스 > 브루트포스(순열)' 카테고리의 다른 글
연산자 끼워넣기 (0) | 2023.03.20 |
---|---|
단어 수학 (중요!!) (0) | 2023.03.18 |
로또 (같은 문자를 포함한 순열) (0) | 2023.02.23 |
외판원 순회 2 (0) | 2023.02.20 |
차이를 최대로 (0) | 2023.02.15 |