666, 1666, 2666, 3666, ... 이런식으로 직접 세봤는데, 규칙이 안나왔다.
그래서 생각한게 브루트 포스에 맞게 665부터 무한루프를 돌리는 방법이다.
우리가 찾는 건 '666' 3번 연속하는 '6'이다. 처음에 문자열로 바꾸고 strstr을 활용해볼까 생각했지만, 아닌 것 같아서 돌렸다.
그렇게 생각한게 666을 찾았다고 가정하고, count하나씩 세준다. 666 발견 -> count++, if(n(입력값) == count) i출력 후 리턴.
그럼 이제 666을 찾아야한다. 문자열로 바꿀 생각이 없기에 각 자리숫자를 하나하나 체크한다. 1266612 로 가정해보자. 저 숫자를 t,s로 각각 저장하고, 반복문으로 돌리면서 666을 찾는다.
끝난 줄 알았지만, 내 코드에서 문제를 발견했다. 다 정상적으로 작동하는데 6666처럼 6이 4개 이상이면, 각 자리마다 6인지 체크하는 반복문을 한 번 더 돌아가게 된다. 그래서 6이 4개 이상이면, i++로 예외처리를 진행했다.
#include <stdio.h>
int main()
{
int i, t, s, n, t1;
int count = 0;
scanf("%d", &n);
i = 665;
while (1)
{
t = i;
s = i;
while (s > 0)
{
t = s % 10;
if (t == 6) // 6이 한 번
{
t = s / 10 % 10;
if (t == 6) // 6이 두 번
{
t = s / 100 % 10;
if (t == 6) // 6이 세 번
{
t1 = s / 1000 % 10; // 6이 네 번일경우 체크
count++;
if (n == count) // count와 n이 같으면 출력.
{
printf("%d", i);
return 0;
}
}
}
}
if (t1 == 6) // 4번이면 i++하고 그냥 한 번 더 돌아가라고 내비둠
i++;
s = s / 10;
}
i++;
}
}
#include <stdio.h>
int i, temp, check, cnt = 1;
int main(void)
{
int series;
scanf("%d", &series);
if (series == 1)
{
printf("666");
return 0;
}
for (i = 667;; i++)
{
temp = i;
check = 0;
while (temp)
{
if (temp % 1000 == 666)
{
check = 1;
}
temp /= 10;
}
if (check)
{
cnt++;
if (cnt == series)
{
break;
}
}
}
printf("%d\n", i);
return 0;
}
나처럼 하나씩 6을 세지 않고, %1000으로 한 번에 해버렸다.
기억하고 가자.