666이 포함된 숫자를 작은 순으로 나열하는 문제입니다.
이런 문제에는 두가지 선택지가 있습니다.
1. 규칙을 찾아서 풀 것인가.
2. 하나하나 나열해서 풀 것인가.
우선 규칙이 있나 찾아보기 위해 작은 수부터 나열해보겠습니다.
666
1666 2666 3666 4666 5666
6660 6661 6662 6663 6664 6665 6666 6667 6668 6669
7666 8666 9666 10666 11666 12666 13666 14666 15666
16660 16661 16662 16663 16664 16665 16666 16667 16668 16669
17666 18666 19666 20666 21666 22666 23666 24666 25666
.
.
.
규칙이 보이시나요?
제가 찾은 규칙은 이렇습니다.
색칠한 부분의 경우,
666 앞의 수의 일의 자리가 7, 8, 9, 10, 1, 2, 3,4, 5 를 벗어나면 색칠하지 않은 부분으로 넘어갑니다.
색칠하지 않은 부분의 경우,
666 앞의 숫자가 1씩 커지면서, 1의자리수가 1~9를 반복하고 있습니다.
여기서, 규칙을 사용하여 문제를 푸는 것보다 숫자를 늘리며 666이 들어갔는지 확인하며 푸는 것이 나을 것 같아
규칙을 사용하지 않기로 결정하였습니다.
풀이 방식)
1. n을 입력받아서 666부터 666이 들어가는 숫자를 작은 순서대로 n-1개 구합니다.
2. 숫자를 하나 구할 때마다 count 라는 변수를 1 증가시켜줍니다.
3. count 변수가 n-1 이 되었을 때, 반복문을 탈출하고 그 숫자를 출력합니다.
코드로 보시면 쉽게 이해하실 수 있습니다.
전체 코드)
#include <stdio.h>
#include <string.h>
int main(void)
{
int n;
scanf("%d", &n);
int num = 666; //영화제목 초기상태
char check[100000] = {0}; //num을 문자열로 변환시켜 담을 배열
int count = 0; //666이 들어간 숫자의 개수를 파악하기 위한 변수
while (1)
{
if (n == 1) //1번째 영화제목은 연산할필요없이 바로 출력
{
break;
}
num++;
sprintf(check, "%d", num); //영화제목을 1증가시키고 문자열로 변환
const char *temp = strstr(check, "666"); //문자열 내에 666이 있는지 판별
if (temp != NULL) //666이 있으면 count를 증가
{
count++;
}
if (count == n - 1) //count가 n-1에 도달하면 반복문 종료
{
break;
}
}
printf("%d\n", num);
return 0;
}
'백준 > c' 카테고리의 다른 글
백준_10773_제로_(stack) (0) | 2024.05.05 |
---|---|
백준_1676_팩토리얼0의개수 (0) | 2024.05.04 |
백준_10989_수정렬하기3(counting sort) (0) | 2024.05.03 |
백준_2903_중앙이동알고리즘 (2) | 2024.05.03 |
백준_1934_최소공배수 (0) | 2024.05.01 |