본문 바로가기
C

[C]백준 11.브루트포스: 1436

by 열지희공 2022. 1. 20.

백준 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번 들어가는지 확인하는 방법이 있었다. 

<관련 링크>

https://cocoon1787.tistory.com/155

'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