궤도

[EPPER] 10회 6번 본문

💻 현생/⛓ 알고리즘

[EPPER] 10회 6번

영이오 2020. 10. 8. 23:16

문제

 


풀이

 

문제가 좀 길지만 잘 읽어보면 어려운 문제는 아니다. 일단 반복문이 언제 끝날지 모르니 while loop를 사용했다. 모든 자릿수의 수가 나와야 반복문이 끝날테니 각 자릿수의 출현 여부를 체크하는 bool 배열도 만들고 이 배열의 모든 값이 true인지 확인하는 함수도 만들었다. 여기까지 했다면 나머지는 쉽다.

 

isAll 함수로 반복문을 탈출할 수 있는지 체크하며 숫자 A를 쪼개가며 digit 배열을 갱신한다. 코드에서의 i가 문제에서의 n이 되는 셈인데 마지막에 i++를 해주기 때문에 이미 모든 자릿수가 나온 상태에서도 무조건 i를 하나 더 증가하게 된다. 그러니 마지막 출력에서 빼준다.


소스코드

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdbool.h>

bool digit[10] = { 0, }; //각 자릿수의 수가 나왔는지 체크하는 bool 배열

bool isAll() { //모든 자릿수가 나왔는지 확인하는 함수
	for (int i = 0; i < 10; i++) {
		if (!digit[i])
			return false;
	}
	return true;
}

int main() {
	int A, i = 1;

	scanf("%d", &A);
	while (!isAll()) { //모든 자릿수가 나오면 loop 벗어남
		int tmp = A * i;
		while (tmp != 0) { //숫자 쪼개며 확인
			digit[tmp % 10] = true;
			tmp /= 10;
		}
		i++;
	}
	printf("%d\n", i - 1); //마지막에 i가 증가됐을테니 하나 빼주는 것
}
Comments