[문제 개요]

1436번: 영화감독 숌
666은 종말을 나타내는 숫자라고 한다. 따라서, 많은 블록버스터 영화에서는 666이 들어간 제목을 많이 사용한다. 영화감독 숌은 세상의 종말 이라는 시리즈 영화의 감독이다. 조지 루카스는 스타
www.acmicpc.net
[풀이 과정]
666이 들어간 숫자들 중 N번째로 작은 숫자가 무엇인지 찾는 문제이다.
1부터 하나씩 증가시키면서 666이 등장하는지 확인한 후 N번째 숫자에 도달할 때 까지 계속 반복 / 비교하는 작업을 해야할 것으로 보인다.
뼈대를 구성해보면
int num;
int count;
while(count가 N이 될때까지){
num 1 증가;
if(num에 666이 포함되어 있다면){
count 1 증가;
}else{
//아무것도 안함
}
}
}
우선 666의 포함 여부를 반환하는 함수가 필요해 보인다. 함수를 작성해보자
int isRightNum(int n){
//6이 최대 몇번 연속으로 등장하는지 계산하기
if(연속 등장횟수가 3 이상이면?){
return 1;
}else{
return 0;
}
}
해당 숫자의 연속 등장 횟수를 구하는 함수를 작성해보자
int maxRow(int n){
int num = n;
int max = 0;
int row = 0;
while(num > 0){
if(num % 10 == 6){
row++;
}
else{
if(max < row){
max = row;
}
row = 0;
}
}
if(max < row){
max = row;
}
return max;
}
숫자를 한자리씩 나눠서 6이 한번 등장한다면, 연속 등장 횟수(row)를 1씩 늘려주고, 만약 6이 아닌 숫자가 등장한다면 연속 등장 횟수를 0으로 만듦과 동시에 연속 등장 횟수가 최대 연속 등장 횟수보다 크다면(초기값은 0) max값을 갱신한다. 최대 연속 등장 횟수를 반환한다.
모든 자리수의 숫자들이 다 6일 것을 감안해서 return 직전 비교를 한번 더 해준다.
isRightNum 함수에 적용해보자
int isRightNum(int n){
if(maxRow(n) >= 3){
return 1;
}else{
return 0;
}
}
6의 최대 연속 등장 횟수가 3 이상이라면 1을 반환한다.
이제 이를 기반으로 main함수를 작성할 수 있다. 앞에서 구성했던 뼈대를 이용해보면
int main(){
int N;
scanf("%d", &N);
int num = 0;
int count = 0;
while(count < N){
num++;
if(isRightNum(num)){
count++;
}
}
printf("%d", num);
}
이렇게 구성할 수 있다.
[전체 코드]
#include <stdio.h>
int maxRow(int n){
int num = n;
int max = 0;
int row = 0;
while(num > 0){
if(num % 10 == 6){
row++;
}
else{
if(max < row){
max = row;
}
row = 0;
}
num /= 10;
}
if(max < row){
max = row;
}
return max;
}
int isRightNum(int n){
if(maxRow(n) >= 3){
return 1;
}else{
return 0;
}
}
int main(){
int N;
scanf("%d", &N);
int num = 0;
int count = 0;
while(count < N){
num++;
if(isRightNum(num)){
count++;
}
}
printf("%d", num);
}
[결과]

'백준' 카테고리의 다른 글
| [C언어] 14888번 연산자 끼워넣기 (삼성 SW 역량 테스트 기출 문제) (0) | 2022.03.14 |
|---|---|
| [문제해결] (백준) 카카오 코드 페스티벌 2018 : 승부 예측 (0) | 2022.03.05 |