/ BOJ

BOJ_1748_수이어쓰기_JAVA

문제 : 수이어쓰기

링크 : BOJ_1748_수이어쓰기

접근 방식

1부터 N까지의 수를 나열한 수의 자릿수는 몇 자리일 지 맞춰야 하는 문제이다.

예를 들어 150이라는 숫자가 있다고 치자.

그러면 123456789101112…150까지 수를 나열하게 된다. 이 수의 자릿수를 구해보자.

자릿수 별로 나누어보면 다음과 같다.

1~9까지 = 9*1

10~99까지 = 90*2

100~150까지 51*3

모두 더하면 342 자리가 된다.

이를 토대로 규칙을 정했다.

  1. 만약 K자리 수가 주어진다면, K-1자리 까지 9(10의 제곱수)각 자리수 위치 만큼 자릿수를 더한다.
    • ex) 9x1, 9x10x2, 9x100x3, 9x1000x4 …
  2. 그 후 마지막 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);

	}

}

자릿수를 구하는 과정에서 은근히 생각해야할 점이 많았다.