https://www.acmicpc.net/problem/2661
문제
숫자 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
재귀로 1,2,3 추가해준다음
substr 로 스트링을 잘라서 같으면 false 반환
그다음 어차피 1(낮은값) 부터 추가되니 길이만 N도달하면 답이니 그이후 return
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
|
#include <iostream>
#include <string>
#include <stack>
#include <algorithm>
#include <vector>
#include <list>
#include <queue>
#include<deque>
using namespace std;
int N;
bool flag = false;
bool chk(string s,int len)
{
int i;
for (i = 1; i <= len / 2; i++)
{
string a, b;
a = s.substr(len-i, i);
b = s.substr(len - i * 2, i);
if (a == b)
{
return false;
}
}
return true;
}
void solve(int len, string s)
{
if (flag)return;
else
{
if (!chk(s, len)) return;
if (len == N)
{
cout << s << endl;
flag = true;
return;
}
solve(len + 1, s + '1');
solve(len + 1, s + '2');
solve(len + 1, s + '3');
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> N;
solve(1, "1");
}
|
cs |
'백준 알고리즘' 카테고리의 다른 글
[C++] 백준알고리즘 2529번 부등호 문제 (0) | 2020.05.06 |
---|---|
[C++] 백준알고리즘 5430번 AC문제 (0) | 2020.04.24 |
[C++] 백준알고리즘 2485번 가로수 문제 (0) | 2020.04.24 |
[C++] 백준알고리즘 1644번 소수의 연속합 문제 (0) | 2020.03.13 |
[C언어,C++] 백준알고리즘 1526번 가장 큰 금민수 (0) | 2019.12.23 |