https://www.acmicpc.net/problem/2661
1,2,3 세개의 숫자를 활용해서 길이 n의 수열을 만들면 된다.
기본적으로 여기까지는 백트래킹을 활용해서 진행해주면 된다.
이후에 나쁜 수열을 걸러내는 과정에서 substr을 적절히 활용해주면 되겠다.
주의할 점은, 검사를 재귀의 진입 부분에서 해야 한다는 것이다.
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 | #include<iostream> #include<set> #include<string> using namespace std; int n, a[3] = { 1,2,3 }, arr[81]; string str = ""; set<string> ans; bool ef = false; void backTracking(int k) { str = ""; for (int i = 0; i < k; i++) str += (arr[i] + '0'); //부분 수열 존재 검사 for (int i = 1; i <= k / 2; i++) { //수열 길이 절반까지만 확인하면 됨 for (int j = 0; j <= k - 2 * i; j++) { if (str.substr(j, i) == str.substr(j + i, i)) { return; } } } //길이 n 완성 if (k == n) { for (int i = 0; i < k; i++) cout << arr[i]; exit(0); //가장 먼저 나오는 게 제일 작은 수열 return; } for (int i = 0; i < 3; i++) { arr[k] = a[i]; backTracking(k + 1); if (ef) return; } } int main(void) { ios::sync_with_stdio(false); cin.tie(0); cin >> n; backTracking(0); return 0; } | cs |
'알고리즘 문제 풀이 > 백준 온라인 저지' 카테고리의 다른 글
백준 1941 소문난 칠공주 C++ (0) | 2019.08.10 |
---|---|
백준 2023 신기한 소수 C++ (0) | 2019.08.10 |
백준 2210번: 숫자판 점프 (C++) (0) | 2019.08.09 |
백준 2589번: 보물섬 (C++) (0) | 2019.08.09 |
백준 17069번: 파이프 옮기기 2 (C++) (0) | 2019.08.09 |