숫자 666이 연속적으로 들어간 숫자들을 크기 순으로 두었다 쳤을 때 N번째 숫자는 무엇인가
처음에는 메모장에 숫자들을 쭉 적어보면서 이것을 어떻게 코드화 시킬지 많이 고민을 했다. 조건문을 사용해서 자릿수 별로 처리를 해줄까 하는 생각도 들었지만 너무 코드가 비효율적이고 길어지는 것 같아 다른 방법을 고민하던 중에 얼마 전에 자릿수 체크 문제를 풀던 아이디어가 생각났다.
숫자에 자릿수를 체크하기 위해서 / 10 을 계속 해주었는데 이번 경우에는 % 10과 / 10 을 함께 사용해서 10씩 줄여가면서 일의 자리를 파악해 6이 3개 이상 나온다면 찾았다고 코드를 작성했다.
<-------------/10을 할 수 있을 때까지------------->
while (temp > 0)
{
<-------숫자 6이 등장했다면?--->
if (temp % 10 == 6)
{
Count++;
temp = temp / 10;
On = 1;
}
숫자 6이 3개 이상 나오는 경우를 찾는 것까지는 그리 오래 걸리진 않았다.
근데 문제는 6066 같이 3개 이상 나오긴 하는데 연속적으로 나오지 않는 경우를 처리해주는 것이 생각보다 까다로웠다. 간단하게 생각해서 조건문을 통해 미리 다음 자리에서 계산을 해보고 다음 계산에서 % 10 != 6 이라면 break를 통해 그 숫자 자체를 제외시켜봤는데 그렇게 하니 66606 같은 수는 6이 3개 이상이지만 06에서 6 다음 숫자가 0이 나왔기에 이런 숫자들을 처리 해줄 수 없게 되었다.
그림판에 그림도 그려보고 많이 고민을 하다가 나온 아이디어가만약 계산을 하다가 이전에 % 10 == 6인 경우가 나왔지만 Count가 2보다 작은 경우에는 Count를 다시 0으로 만들어 버려볼까 싶어 작성 후 돌려봤는데 잘 돌아갔다!!!😹
가장 작은 숫자인 666부터 시작을 해서 일정 숫자까지 반복문을 돌리며 찾고, 만약 숫자를 찾았다면 배열 안에 차곡 차곡 집어넣어 마치 숫자 크기대로 집어넣는 듯 배열 속에 숫자들을 넣었다.
if (Count >= 3)
Ary[index++] = i;
비쥬얼 스튜디오에서 계속 시도를 하고 백준에 돌려서 틀리진 않았지만, 비쥬얼에서 엄청 많은 시도를 했다.. 문제의 난이도나 다른 사람들이 맞은 정도를 봤을 때는 그렇게 어려운 문제는 아닌가 하는 생각도 들긴 했으나 나에겐 생각보다 조금 버거운 문제였다. 30~40분 정도 걸린 것 같다. 더 더 노력해야지..
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int Ary[100000] = {0, };
int Count = 0;
int temp = 0;
int index = 0;
int On = 0;
int A = 0;
scanf("%d", &A);
for (int i = 666; i <= 10000000; i++)
{
Count = 0;
temp = i;
while (temp > 0)
{
if (temp % 10 == 6)
{
Count++;
temp = temp / 10;
On = 1;
}
else
{
temp = temp / 10;
if (On == 1 && Count <= 2)
Count = 0;
}
}
if (Count >= 3)
Ary[index++] = i;
}
printf("%d\n", Ary[A - 1]);
}