티스토리 뷰
문제
알고리즘
백트래킹
풀이
임의의 길이의 인접한 두 개의 부분 수열이 동일하지 않도록 길이$N$까지를 결정하여 출력하는 문제입니다.
백트래킹 문제입니다. 처음에 빈 수열에서 시작하여 수열의 원소를 하나씩 결정해나갈때마다 '좋은수열'인지 검사합니다. 이를 통해 채워나가는 수열은 '좋은수열'로 유지할수가 있습니다. 원소가 추가된 수열에서 좋은수열인지 아닌지를 검사할 때, 추가된 원소를 포함하도록 부분 수열을 구성하기만 하면 됩니다. 예를 들어 1213에서 1을 추가하면
12131이 됩니다. 우리는 첫번째 1과 두번째 2가 좋은 수열인지 검사할 필요가 없습니다. 마지막 수열 1을 포함하는
1, 31과 인접한 수열만 검사하면 됩니다. 이렇게 길이 $N$의 수열을 구성했다면, 그 수열은 가장 작은 좋은수열임을 알 수 있습니다.
나쁜수열을 만들었다면, 남은 길이를 만들어 볼 필요가 없음을 생각하며 구현하도록 합시다.
코드
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < n; ++i)
#define REP(i, n) for (int i = 1; i <= n; ++i)
using namespace std;
string STR[3] = { "1", "2", "3" };
int N;
bool ok(string s) {
int len = s.size();
int st = len - 1;
for (int i = 1; i <= len / 2; ++i) {
string a = s.substr(st - i, i);
string b = s.substr(st, i);
if (a == b)
return false;
st--;
}
return true;
}
void solve(int len, string s) {
if (!ok(s))
return;
if (len == 0) {
cout << s;
exit(0);
}
for (int i = 0; i < 3; ++i) {
solve(len - 1, s + STR[i]);
}
}
int main() {
#ifndef ONLINE_JUDGE
freopen("in", "r", stdin);
freopen("out", "w", stdout);
#endif
cin.tie(NULL);
cout.tie(NULL);
ios::sync_with_stdio(false);
cin >> N;
solve(N, "");
return 0;
}
'Algorithm' 카테고리의 다른 글
[백준 20052] 괄호 문자열 ? (0) | 2020.11.12 |
---|---|
[백준 2263] 트리의 순회 (0) | 2020.11.11 |
[백준 18783] Swapity Swapity Swap (0) | 2020.11.09 |
[백준 14226] 이모티콘 (2) | 2020.11.08 |
[백준 13511] 트리와 쿼리2 (0) | 2020.11.06 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- implementation
- spring boot
- string
- hld
- kmp
- Segment tree
- 트라이
- 이분탐색
- sorting
- DP
- SCC
- Fenwick
- 2-SAT
- dfs
- 좌표압축
- 펜윅트리
- knapsack
- union find
- sweeping
- spring
- 세그먼트트리
- Suffix Array
- 스위핑
- dijkstra
- 동적계획법
- 정렬
- Oracle
- bfs
- greedy
- 이분매칭
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함