재귀를 통해 숫자를 붙혀나가는 방식을 시도해봤지만 그렇게 풀리는 문제가 아니였다. 그래서 풀이를 찾아보고 공부했다. 도저히 내가 생각해낼 수 있는 문제는 아니였다. 마이구미님의 해설과 백준님의 해설을 보고 공부하였다.
이 문제는 다음과 같은 규칙을 찾아야한다.
어떤 숫자 A의 일의 자리가 0이고 B의 일의 자리가 9일 때 A에서 B까지 0 ~ 9의 숫자가 등장하는 횟수는 (B/10 - A/10 + 1) * 원래 숫자에서의 자릿수
다.
따라서 구현 순서는 다음과 같다.
++
, 마지막 페이지의 일의 자리가 9가 될 때 까지 --
하며 그 과정에 등장하는 숫자들은 따로 세어준다.import java.util.Scanner;
public class Main {
static int[] cnt;
static int start, end, digit;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
digit = 1;
start = 1;
end = sc.nextInt();
cnt = new int[10];
while(start <= end) {
// 시작 페이지의 마지막 자리가 0이 될 때 까지 ++
while(start % 10 != 0 && start <= end) {
counting(start, digit);
start++;
}
// 마지막 페이지의 마지막 자리가 9가 될 때 까지 --
while(end % 10 != 9 && start <= end) {
counting(end, digit);
end--;
}
if(start > end) break;
// 마지막 자릿수를 제거한다.
start /= 10;
end /= 10;
// start ~ end 사이의 0 ~ 9 갯수를 모두 센다.
// 현재 자릿수 만큼 곱해줘야한다.
for(int i = 0 ; i < 10 ; ++i) {
cnt[i] += (end - start + 1) * digit;
}
// 자릿수를 높인다.
digit *= 10;
}
for(long i : cnt) {
System.out.print(i + " ");
}
}
private static void counting(int num, int digit) {
while(num > 0) {
cnt[num % 10] += digit;
num /= 10;
}
}
}