본문 바로가기
Algorithm

[백준 Silver 3] 1748 수 이어 쓰기 1 - Java

by Ray 2022. 1. 16.

문제링크 : https://www.acmicpc.net/problem/1748

 

1748번: 수 이어 쓰기 1

첫째 줄에 N(1 ≤ N ≤ 100,000,000)이 주어진다.

www.acmicpc.net

 

접근 과정 : 

  • 완전탐색으로 수를 N까지 탐색하면서, 그 자릿수를 모두 더해주었다.
  • ++
  • N까지 모든 수를 탐색하지 않아도, 수의 범위로 자릿수의 총합을 구할 수 있다.
  • 1~9  /  10~99 / 100~999 / ....  등 N과 각 자릿수의 범위 관계로 탐색연산의 횟수를 줄일 수 있다.

 

소스 코드 및 결과 :

package BOJ;

/**
    수 이어 쓰기 1
    
    완전탐색
*/

import java.io.*;

public class BOJ1748 {

    public static void main(String[] args) throws NumberFormatException, IOException {

        new BOJ1748().solution();
    }

    private void solution() throws NumberFormatException, IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());

        int answer = 0;
        int digit = 1;
        int range = 10;
        for (int i = 1; i <= N; i++) {
            if (i % range == 0) {
                digit++;
                range *= 10;
            }
            answer += digit;
        }

        System.out.println(answer);
    }

}

 

package BOJ;

/**
    수 이어 쓰기 1
    
    자릿 수 범위 계산
*/

import java.io.*;

public class BOJ1748_copy {

    public static void main(String[] args) throws NumberFormatException, IOException {

        new BOJ1748_copy().solution();
    }

    private void solution() throws NumberFormatException, IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());

        int answer = 1;
        int digit = 1;
        int range = 10;
        for (int i = 1; i <= N; i++) {

            if (N >= range) {
                answer += ((range - (range / 10)) * digit)+1;
                i = range - 1;
                digit++;
                range *= 10;
            } else {
                answer += ((N - (range / 10)) * digit);
                break;
            }
        }

        System.out.println(answer);
    }

}

 

P.S