BOJ_1748_수이어쓰기_JAVA
문제 : 수이어쓰기
링크 : BOJ_1748_수이어쓰기
접근 방식
1부터 N까지의 수를 나열한 수의 자릿수는 몇 자리일 지 맞춰야 하는 문제이다.
예를 들어 150이라는 숫자가 있다고 치자.
그러면 123456789101112…150까지 수를 나열하게 된다. 이 수의 자릿수를 구해보자.
자릿수 별로 나누어보면 다음과 같다.
1~9까지 = 9*1
10~99까지 = 90*2
100~150까지 51*3
모두 더하면 342 자리가 된다.
이를 토대로 규칙을 정했다.
- 만약 K자리 수가 주어진다면, K-1자리 까지 9(10의 제곱수)각 자리수 위치 만큼 자릿수를 더한다.
- ex) 9x1, 9x10x2, 9x100x3, 9x1000x4 …
- 그 후 마지막 K번째 자릿수는 해당 자릿수의 시작값 10, 100, 1000… 등을 주어진 수에서 뺀 후 +1 하여 자릿수만큼 곱해준뒤 총 자릿수에 더해준다.
- ex) 355인 경우 (355 - 100 + 1) * 3 = 256*3
위 2개의 규칙대로 코드를 구현 하고 나온 결과값을 더해서 출력하면 된다.
소스 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BOJ_1748_수이어쓰기1 {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String str = in.readLine();
long cnt = 0;
long mul = 9;
if(str.length() == 1) {
System.out.println(Integer.parseInt(str));
System.exit(0);
}
for (int i = 1, n = str.length(); i <= n; i++) {
if (i == n) {
long cur1 = Long.parseLong(str);
cnt = cnt + (cur1-mul/9+1) * n;
break;
}
cnt = cnt + mul*i;
mul = mul * 10;
}
System.out.println(cnt);
}
}
자릿수를 구하는 과정에서 은근히 생각해야할 점이 많았다.