728x90

https://www.acmicpc.net/problem/2661

 

2661번: 좋은수열

첫 번째 줄에 1, 2, 3으로만 이루어져 있는 길이가 N인 좋은 수열들 중에서 가장 작은 수를 나타내는 수열만 출력한다. 수열을 이루는 1, 2, 3들 사이에는 빈칸을 두지 않는다.

www.acmicpc.net

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

int n;
bool foundAnswer = false;

void select(vector<int> result, int num) {
	if (foundAnswer) return;
	if (num == n) {
		string s = "";
		for (int i = 0; i < n; i++) {
			s += to_string(result[i]);
		}
		for (int i = 0; i < n; i++) { //어디서부터 시작하는지
			for (int j = 1; j < n - i; j++) { //몇개짜리 수열인지
				if (s.substr(i, j) == s.substr(i + j, j)) {
					return;
				}
			}
		}

		foundAnswer = true;
		for (int i = 0; i < n; i++) {
			cout << result[i];
		}
		return;
	}
	for (int i = 1; i <= 3; i++) {
		result[num] = i;
		select(result, num + 1);
	}
}

int main() {
	cin >> n;
	vector<int> result(n);
	select(result, 0);
	return 0;
}

시간초과

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

int n;
bool foundAnswer = false;

void select(string result, int num) {
	if (foundAnswer) return;
	if (num == n) {
		for (int i = 0; i < n; i++) { //어디서부터 시작하는지
			for (int j = 1; j < n - i; j++) { //몇개짜리 수열인지
				if (result.substr(i, j) == result.substr(i + j, j)) {
					return;
				}
			}
		}

		foundAnswer = true;
		cout << result;
		return;
	}
	for (int i = 0; i < 3; i++) {
		result[num] = '1' + i;
		select(result, num + 1);
	}
}

int main() {
	cin >> n;
	string result("");
	for (int i = 0; i < n; i++)
		result.append("1");
	select(result, 0);
	return 0;
}

애초에 string으로 해보았다. 이것도 시간초과

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

int n;
bool foundAnswer = false;

void select(string result, int num) {
	if (foundAnswer) return;
	if (num == n) {
		for (int i = 0; i < n; i++) { //어디서부터 시작하는지
			for (int j = 2; j < n - i; j++) { //몇개짜리 수열인지
				if (result.substr(i, j) == result.substr(i + j, j)) {
					return;
				}
			}
		}

		foundAnswer = true;
		cout << result;
		return;
	}
	for (int i = 0; i < 3; i++) {
		if (num == 0) {
			result[num] = '1' + i;
			select(result, num + 1);
		}
		else {
			if (result[num - 1] == '1' + i) continue;
			result[num] = '1' + i;
			select(result, num + 1);
		}
	}
}

int main() {
	cin >> n;
	string result("");
	for (int i = 0; i < n; i++)
		result.append("1");
	select(result, 0);
	return 0;
}

재귀호출 전에 인접한 것이 같으면 재귀호출을 안 하도록 했는데 이것도 시간초과

728x90

'알고리즘 문제' 카테고리의 다른 글

[백준] 2979번 트럭 주차  (0) 2020.02.11
[백준] 5532번 방학 숙제  (0) 2020.02.11
[백준] 1759번 암호 만들기  (0) 2020.02.11
[백준] 4641번 Doubles  (0) 2020.02.11
[백준] 6321번 IBM 빼기 1  (0) 2020.02.10

+ Recent posts