#작성 코드
#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 |