분류
수학
문제 설명
옛날에는 책을 만들 때, 한글자 한글자를 나눠서 활자를 만들어서 그걸 합쳐서 책을 만들었다고 한다. 예를 들면 가나다라는 글씨를 쓰기 위해서는 3개의 활자가 필요할 것이다. 그렇다고 할 때, N이하의 자연수를 활자로 표현하기 위해서는 몇 개의 활자가 필요한지 구하여라. 예를 들어 10이하의 자연수를 활자로 표현하려면 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 0 이렇게 11개의 활자가 필요할 것이다.
입력
첫째 줄에 N(1 ≤ N ≤ 2,000,000,000)이 주어진다.
출력
첫째 줄에 필요한 활자의 수를 1234567로 나눈 나머지를 출력한다.
예제 입력
10
예제 출력
11
코드 - 활자.java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long n = sc.nextLong();
long answer = 0;
while(n > 9) {
long len = Long.toString(n).length();
answer += (n - Math.pow(10, len - 1) + 1) * len;
n = (long) Math.pow(10, len - 1) - 1;
}
answer += n;
System.out.println(answer % 1234567);
}
}
코드 분석하기
위의 코드는 주어진 N까지의 모든 숫자들을 표현하기 위해 필요한 활자의 수를 계산합니다. 여기서 활자의 수란 각 숫자를 이루는 각 자리의 숫자의 개수를 의미합니다. 예를 들어, 10까지의 숫자를 표현하기 위해 필요한 활자의 수는 11개입니다(1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 0).
이를 계산하기 위해 다음과 같은 접근 방식을 사용하였습니다.
- n : 입력받은 숫자. 이 숫자를 통해 반복문을 돌며 각 숫자 범위별로 필요한 활자의 수를 계산합니다.
- answer : 필요한 활자의 총 수를 저장하는 변수입니다.
- len : 현재 n의 자릿수를 저장하는 변수입니다.
반복문에서는 n이 9보다 큰 동안 다음을 수행합니다:
- 현재 n의 자릿수(len)를 계산하고, 이 자릿수의 숫자들이 n에서 몇 개 있는지 계산하여 answer에 더합니다. 이 때, n에서 10^(len-1)의 값을 빼고 1을 더한 후 len을 곱함으로써 n까지의 해당 자릿수의 숫자 개수를 계산합니다. 예를 들어, n이 132일 경우, len은 3이고 n에서 10^(3-1)=100을 빼면 32가 되며, 여기에 1을 더하면 33이 됩니다. 이는 100부터 132까지의 숫자들 중 3자리 숫자가 33개라는 것을 의미합니다. 이를 len에 곱하면 99가 되며, 이는 100부터 132까지의 숫자들을 이루는 활자의 수입니다.
- n을 10^(len-1) - 1로 갱신합니다. 이는 다음에는 len-1자리의 숫자들을 계산하기 위함입니다.
반복문이 종료되면 n은 9 이하의 숫자가 됩니다. 이 경우에는 n 자체가 n을 이루는 활자의 수가 됩니다. 따라서 n을 answer에 더하고, 이를 1234567로 나눈 나머지를 출력합니다. 이렇게 나누는 이유는 문제의 출력 조건 때문입니다.
이렇게 하면 주어진 n까지의 모든 숫자들을 표현하기 위해 필요한 활자의 수를 계산할 수 있습니다.
백준에서 문제 풀어보기
https://www.acmicpc.net/problem/1951
1951번: 활자
옛날에는 책을 만들 때, 한글자 한글자를 나눠서 활자를 만들어서 그걸 합쳐서 책을 만들었다고 한다. 예를 들면 가나다라는 글씨를 쓰기 위해서는 3개의 활자가 필요할 것이다. 그렇다고 할 때,
www.acmicpc.net