백준 1436
내코드
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
int num = 0;
int i = 666;
while (1) {
int copy = i;
int countsix = 0;
while (copy > 0) {
if (copy % 10 == 6) {
countsix++;
if (countsix >= 3) {
break;
}
}
else {
countsix = 0;
}
copy /= 10;
}
if (countsix >= 3) {
num++;
}
if (num == n) {
printf("%d", i);
break;
}
i++;
}
return 0;
}
i를 666부터 계속 증가시켜가며 i가 조건에 맞는지 확인하였다.
i는 6이 3번이상 연속으로 들어간 n번째로 작은 수여야 한다.
따라서 copy에 i값을 넣은 뒤 copy의 각 자리 수를 확인하였고, 해당 자리의 수가 6이라면 6의 개수를 세는 countsix를 1씩 증가시켰다. 또 만약 countsix가 3이상이라면 종말 숫자의 조건을 만족하는 것이기에 더 이상 나머지 자리 수를 확인하지 않고 탈출했다. 종말숫자의 조건은 6이 연속으로 나와야하는 것이기에 만약 해당 자리 수가 6이 아니라면 countsix를 다시 0으로 초기화시켰다.
i의 각 자리 수를 살펴본 뒤 i가 종말숫자의 조건을 충족한다면 i까지 종말숫자의 개수인 num을 1증가시켰다. 또 만약 num이 구해야하는 n과 같다면 i를 출력한 뒤 while반복문을 탈출했다.
만약 i가 종말 숫자가 아니라면 i를 1증가시켜 다시 반복하는 형태이다.
나는 한 자리수씩 6인지 체크했는데 다른 사람의 코드를 보니 %1000=666을 통해 6이 연속으로 3번 들어가는지 확인하는 방법이 있었다.
<관련 링크>
'C' 카테고리의 다른 글
[C]백준 12.정렬: 2751 (0) | 2022.01.21 |
---|---|
[C]백준 12.정렬: 2750 (0) | 2022.01.21 |
[C]백준 11.브루트포스: 1018 (0) | 2022.01.20 |
[C]백준 11.브루트포스: 7568 (0) | 2022.01.20 |
[C]백준 11.브루트포스: 2231 (0) | 2022.01.20 |