본문 바로가기

BOJ 길라잡이

[C/C++ 백준 2661번] 좋은수열 (Gold 4)

www.acmicpc.net/problem/2661

 

2661번: 좋은수열

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

www.acmicpc.net

확실히 코드를 짧게 쓰는 연습을 해야할것 같다고 느낀 문제.

자릿수에 하나씩 넣어가면서 해당 배열이 맞는치 체크해서, 제일 처음 나온 배열이 가장작은 배열이므로 해당 배열을 출력해주면 된다.

 

#include <cstdio>
#include <algorithm>
using namespace std;
int N, answerarray[81]={9,};
bool success = false;
bool Check(int start, int array[]){
	int len = 2;
	while(2*len-1<=start){
		for(int i=0; i+2*len-1<=start; i++){
			bool ok = false;
			for(int j=0; j<len; j++){
				if(array[i+j]!=array[i+j+len]){
					ok = true;
				}
			}
			if(!ok)
				return false;
		}
		len++;
	}
	return true;
}
void func(int start, int array[]){
	if(success)
		return ;
	if(start==0){
		array[0] = 1;
		func(start+1, array);
	}
	if(start==N){
		/*for(int i=0; i<start; i++)
			printf("%d",array[i]);
		printf("\n");*/
		for(int i=0; i<N; i++)
			printf("%d", array[i]);
		success = true;
		/*for(int i=0; i<start; i++)
			printf("%d",answerarray[i]);
		printf("\n");
		printf("\n------\n");*/
	}
	else{
		for(int i=1; i<=3; i++){
			if(array[start-1]!=i){
			array[start] = i;
			if(Check(start, array)){
				func(start+1, array);
			}	
			}
		}
	}
}
int main(void){
	scanf("%d", &N);
	int array[N];
	func(0, array);
}