본문 바로가기

Solutions/Mr.K's Solution

PKU 2719. Faulty Odometer. [판정:AC]


크하하하

이건 뭐
제 포스팅을 미뤄놓고 놀다보니 문제풀 시간은 남는군요



풀이는 간단합니다

주어진 input에 대해서
input보다 작은 자연수들 중에 4가 하나라도 들어가는 것의 개수를 세어서 input에서 빼주면 됩니다


dscanf함수는 scanf함수를 가지고 응용한 함수입니다
이전에도 문제풀 때 종종 사용하였고 앞으로도 종종 쓰겠지요
scanf로 입력받은 숫자를 그대로 반환하는 기능을 합니다 (앞의 d는 scanf에서 %d로 입력받아서 -_-;)

length함수는 input의 자리수를 구하는 함수입니다
<math.h>를 include하여 [1 + log10(num)]을 구해도 같은 결과가 나올 것이고,
<stdlib.h>와 <string.h>를 include하여 itoa와 strlen을 이용해도 같은 결과가 나올 것이라 짐작합니다

pow10함수는 10의 거듭제곱을 구하는 함수입니다
이건 따로 설명이 필요없을 것 같으니 패스-


checker함수가 이 소스의 핵심이 되는 함수입니다
input보다 작은 자연수들 중에 4가 하나라도 들어가는 것의 개수를 세어주는 기능을 합니다
이 함수의 body를 그대로 올려놓으면, solution을 읽고 푸는 것에 방해가 될 것을 염려해서 한동안 비공개처리할까 합니다 -_-;


아 그리고,
ninetable에 대해 설명하는 것을 깜빡했는데,

이 배열은 input이 9로만 이루어진 숫자일 때의 checker함수의 반환값입니다
(이건 수작업으로 계산했습니다, main에서 for문으로 돌립니다)

즉, 9일 때는 4 하나뿐이므로 ninetable[0]은 1이고,
99일 때는 4, 14, 24, 34, 40, 41, …, 49, 54, …, 94 이므로 ninetable[1]은 19이고,
위와 같은 방식으로 checker(99999999)까지 계산해놓습니다

이 작업은 checker함수에서 유용하게 사용했습니다 :)