좋은 인연, 좋은 발견

숫자개수 구하는 알고리즘입니다. 본문

it

숫자개수 구하는 알고리즘입니다.

dohwankim 2018. 5. 2. 22:14

10,100,100,10000 단위에 8 이라는 숫자가 몇개가 있는지 세어보는 방법은 여러가지가 있습니다.

숫자를 하나하나 적어보면서 세어보는 방법이 있겠으나 좀 더 간결한 방법을 찾고자 합니다.


일단, 간단히 10에서 10000까지 각 단위에 8이라는 숫자가 몇개인지 세어보겠습니다.


10 단위에 8이라는 숫자는 1개 입니다.

100 단위에 8이라는 숫자는 20개 입니다.

1000 단위에 8이라는 숫자는 300개 입니다.

10000 단위에 8이라는 숫자는 4000개 입니다.


최초에 알고리즘을 만들게 된건 호기심이었습니다.

단순히 루프를 하여 값을 구할 경우 굉장한 트래픽을 유도하게 됩니다.

단위가 10000 이라 그렇지 1000000000 일경우 계산하는데에 걸리는 시간이 꽤 걸립니다. 직접해보시면 알 수 있습니다.


이러한 문제를 해결해보고자 하는게 첫번째 이유겠지만, 필자는 단순히 호기심에 시작해보았습니다.


 자, 이제 단위별 개수가 몇개인지 답을 얻었습니다. 이제 남은 건 대입입니다. 보통 수학공부를 할 때에는 공식에 무엇인가를 대입하여 값을 구하는 방식이 대부분이었을 것입니다.

그런데 지금은 공식이 없습니다. 어떻게 대입을 하라는 건지 의문이겠으나, 간단히 생각해보면 됩니다.

모든 수식은 기본에서 시작합니다. +,-,*,/ 의 사칙연산을 말합니다.


첫번째 전제, 10단위에 8이라는 숫자는 1개 입니다.

8/10+1 = 1 이런식으로 대입을 해보는 것입니다.

하지만 구해야하는 숫자는 1개입니다. 그러므로 위 공식은 맞지 않습니다.

공식을 다시한번 만들면 10 / 10 입니다.

앞에 10은 단위이고 뒤에 10은 8이라는 숫자는 반드시 10에 포함되므로 10을 주었습니다.


두번째 전제, 100 단위에 8이라는 숫자는 20개 입니다.

단위 / 10 이라는 공식에 대입해보면 100 / 10 이 됩니다. 구한 결과는 10이 됩니다.

답이 맞지 않았습니다. 이제 한번 더 고민의 시간입니다.

10이라는 값이 20이 되려면 * 2를 해주면 해결될 것입니다.

이렇게 공식을 바꿔서 대입해보면 (100 / 10)*2 가 됩니다. 구한 결과는 20이 됩니다.


세번째 전제, 1000 단위에 8이라는 숫자는 300개 입니다.

(단위/ 10) * 2 라는 공식에 대입해보면 (1000 / 10) * 2 가 됩니다. 구한 결과는 200이 됩니다.

답이 맞지 않았습니다. 이제 한번 더 고민의 시간입니다.

200이라는 숫자가 300이 되려면 + 100을 해주면 해결될 것입니다. 하지만 모든 전제가 맞아야하기 때문에 이런 방법은 맞지 않습니다.

그런데 말입니다. 전제를 풀다보면 [(단위 / 10) * 특정값]이란 공식이 자연스럽게 만들어지게 됩니다.


이 특정값은 10일때는 1이고 100일때는 2이고 1000일때는 3이 됩니다.

학창시절 수학을 좀 해본사람이라면 log에 대해 알 것입니다. 바로 log를 이용하면 저런 값을 얻을 수 있습니다.

단위의 제곱값을 구해서 특정값에 대입하면 될 것 같습니다.


네번째 전제, 10000 단위에 8이라는 숫자는 4000개 입니다.

새로운 공식 [(단위 / 10) * 단위의 제곱 수]에 대입해보겠습니다.

(10000 / 10) * log 10000 의 결과는 4000 입니다.


우연히 쉽게 공식을 만들어 볼 수 있었습니다.



Comments