순열을 먼저 만들고, 그 사이사이에 입력된 부등호를 껴놓은 후 모든 조건을 만족하면 출력하는 문제.
n개의 숫자로 모든 순열을 만들어보는 함수인
next_permutation과 prev_permutation이 있음을 잊고 있었다. <헤더파일은 algorithm>
next_permutation은 오름차순이기 때문에 최소값을 구할 때 쓰고,
prev_permutation은 내림차순, 최대값을 구할 때 쓰면 된다.
코드
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 | #include<stdio.h> #include<iostream> #include<vector> #include<algorithm> using namespace std; int n; vector<char>arr; vector<int>big; vector<int>small; bool go(vector<int>tmp) { for (int i = 0; i < arr.size(); i++) { if (arr[i] == '<' && tmp[i] > tmp[i + 1]) { return false; } if (arr[i] == '>' && tmp[i] < tmp[i + 1]) { return false; } } return true; } int main() { cin >> n; for (int i = 0; i < n; i++) { char temp; cin >> temp; arr.push_back(temp); } for (int i = 9; i >= 9 - n; i--) { big.push_back(i); } for (int i = 0; i <= n; i++) { small.push_back(i); } do { if (go(big) == true) { for (int i = 0; i < big.size(); i++) { cout << big[i]; } break; } } while (prev_permutation(big.begin(), big.end())); cout << endl; do { if (go(small) == true) { for (int i = 0; i < small.size(); i++) { cout << small[i]; } break; } } while (next_permutation(small.begin(), small.end())); } | cs |
'BOJ' 카테고리의 다른 글
백준 14889 / 스타트와 링크 (0) | 2019.01.19 |
---|---|
백준 1339 / 단어 수학 (0) | 2019.01.19 |
백준 6064 / 카잉 달력 (0) | 2019.01.18 |
백준 1107 / 리모컨 (0) | 2019.01.17 |
백준 5719 / 거의 최단 경로 (0) | 2019.01.17 |