link : https://www.acmicpc.net/problem/2661
좋은수열 성공
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞은 사람 | 정답 비율 |
---|---|---|---|---|---|
1 초 | 128 MB | 1835 | 989 | 793 | 58.138% |
문제
숫자 1, 2, 3으로만 이루어지는 수열이 있다. 임의의 길이의 인접한 두 개의 부분 수열이 동일한 것이 있으면, 그 수열을 나쁜 수열이라고 부른다. 그렇지 않은 수열은 좋은 수열이다.
다음은 나쁜 수열의 예이다.
- 33
- 32121323
- 123123213
다음은 좋은 수열의 예이다.
- 2
- 32
- 32123
- 1232123
길이가 N인 좋은 수열들을 N자리의 정수로 보아 그중 가장 작은 수를 나타내는 수열을 구하는 프로그램을 작성하라. 예를 들면, 1213121과 2123212는 모두 좋은 수열이지만 그 중에서 작은 수를 나타내는 수열 1213121이다.
입력
입력은 숫자 N하나로 이루어진다. N은 1 이상 80 이하이다.
출력
첫 번째 줄에 1, 2, 3으로만 이루어져 있는 길이가 N인 좋은 수열들 중에서 가장 작은 수를 나타내는 수열만 출력한다. 수열을 이루는 1, 2, 3들 사이에는 빈칸을 두지 않는다.
예제 입력 1
7
예제 출력 1
1213121
백트래킹문제이다. string을 이용해서 잘라가면서 가장 작은 좋은수열을 출력했다.
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 | #include<iostream> #include<string> using namespace std; int N; bool finish; string value; void dfs(int); bool check(int); int main() { cin >> N; dfs(0); return 0; } void dfs(int depth) { string temp; temp = value; if (depth == N) { finish = true; cout << value; return; } for (int i = 1; i <= 3; i++) { value = temp; value += (char)(i + '0'); if(check(depth) == true) { if (finish == true) return; dfs(depth + 1); } } } bool check(int depth) { string temp1 = "", temp2 = ""; if (depth == 0) return true; for (int i = 1; i <= (depth+1) / 2; i++) { temp1 = value.substr(0, i); for (int j = i; j <= depth + 1 - i; j++) { temp2 = value.substr(j, i); if (temp1 == temp2) return false; temp1 = value.substr(j-i+1,i); } } return true; } | cs |
'Programming > BOJ Solutions' 카테고리의 다른 글
[백준 3020번] 개똥벌레 (0) | 2018.06.20 |
---|---|
[백준 2800번] 괄호 제거 (0) | 2018.06.20 |
[백준 2583번] 영역 구하기 (0) | 2018.06.20 |
[백준 2493번] 탑 (0) | 2018.06.20 |
[백준 2339번] 석판 자르기 (0) | 2018.06.20 |