#작성 코드

#include <cstdio>

int main(){
	int N;
	scanf("%d", &N);		// 몇 번째 영화의 제목이 궁금한지 
	
	int cnt=1, number=666;	// 666은 가장 작은 종말의수  
	int a, b, c;	// 연속된 세 자리의 자릿수를 저장할 변수 
	while(1){
		if( cnt == N ) break;
		number++;
		int numcopy = number;
		int serial = 0;
		while( numcopy ){
			int temp = numcopy%10;	// 일의 자리수부터 차례로 비교 
			if( temp == 6 ){
				serial++;
			}
			else if( serial<3 ){	// 그 다음 수가 6이 아니면 serial 초기화 
				serial = 0;			// 6이 연속으로 안나왔으므로! 
			}
			numcopy/=10;			// 그 다음 자리수가 일의 자리수로 오도록 
		}							// 현재 number의 모든 자리수 비교 완료 
		if( serial >= 3 ){			// 6이 세 번 이상 연속으로 등장 
			cnt++;
		} 
	}
	printf("%d\n", number);
	return 0;
}

##

처음엔 각 자리수의 비교를 아래와 같이 진행했었는데 연산의 횟수가 불필요하게 많았던 것 같다.

#include <cstdio>

int main(){
	int N;
	scanf("%d", &N);		// 몇 번째 영화의 제목이 궁금한지 
	
	int cnt=0, number=665;	// 666은 가장 작은 종말의수  
	int a, b, c;	// 연속된 세 자리의 자릿수를 저장할 변수 
	 
	while(cnt<N){
		int t=100;
		do{
			a = number/t;
			b = (number%t)/(t/10);
			c = number%(t/10);
			if( a==6 && b==6 && c==6 ){
				cnt++;
			}else{
				t*=10;
			}
		}while( t<number );
		number++;
	}
	printf("%d", number-1);
	return 0;
}

각 자리수를 작은 자릿수부터 비교할 때, 아래와같이 연산하면 연산횟수를 많이 줄일 수 있음을 알았다.

int temp = number%10;

...

number /= 10;

'BOJ' 카테고리의 다른 글

BOJ 1427번 :: 소트인사이드  (0) 2019.11.23
BOJ 2108번 :: 통계학  (0) 2019.11.23
BOJ 1018번 :: 체스판 다시 칠하기  (0) 2019.11.21
BOJ 7568번 :: 덩치  (0) 2019.11.21
BOJ 2231번 :: 분해합  (0) 2019.11.21

+ Recent posts