📍 수 이어 쓰기 1

https://www.acmicpc.net/problem/1748

 

 

 

✨ 방법1 ✨

 

 

 

입력받은 숫자의 자리수를 구하기 위해 String으로 변환 후 길이를 구한다.

int num = Integer.parseInt(sc.readLine());
String numLength = num + " ";
int len = numLength.length() - 1;

 

 

 

 

 

 

1 ~ 9 까지는 자리수가 1,

10부터 99까지는 자리수가 2,

100부터 999까지는 자리수가 3이다.

 

세 번째 테스트 케이스의 경우, 입력 : 120, 출력 : 252이다.

num * len을 해버리면 1~120까지 3번 곱하는 것인데, (120의 자리수는 3)

이는 1~9까지 1번만, 10~99까지 2번만 곱할 것을 전부 3번씩 곱해버리는 것이기 때문에 오버해서 곱하는 것이다.

따라서 num * len 한 값에서 1~9까지 2번, 10~99까지 1번을 빼야 하는데, 이는 1~9까지 1번, 1~99까지 1번과 똑같은 값이다.

자리수의 크기만큼 반복문을 돌면서 오버해서 곱한 값들을 변수 sum에 담고 마지막에 num*len에서 빼준다.

String str = "9";
int sum = 0;

for(int i=1; i<len; i++){
    sum += Integer.parseInt(str);
    str += 9;
}

System.out.println(num*len - sum);

 

 

 

✨ 전체 코드 ✨

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader sc = new BufferedReader(new InputStreamReader(System.in));
        int num = Integer.parseInt(sc.readLine());
        String numLength = num + " ";
        int len = numLength.length() - 1;

        String str = "9";
        int sum = 0;
        
        for(int i=1; i<len; i++){
            sum += Integer.parseInt(str);
            str += 9;
        } System.out.println(num*len - sum);
    }
}

 

 

 

🌀 성능

  • 메모리 : 15,892 KB
  • 시간 : 120 ms

 

 

 

⚡️ 방법2 ⚡️

 

 

 

⚡️ 전체코드 (wra님 코드) ⚡️

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    static int N;
    
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(in.readLine());
        
        int ans = 0;
        for (int start = 1, len = 1; start <= N; start *= 10, len++) {
            int end = start * 10 - 1;
            if (end > N)
                end = N;
            ans += len * (end - start + 1);
        }
        System.out.println(ans);
    }
    
}

 

 

 

🌀 성능

  • 메모리 : 11340 KB
  • 시간 : 68 ms

 

 

 


문자열로 변환하지 않고 수식으로 풀 수 있을 것 같긴 했는데 도저히 식이 떠오르지 않았다. 🙂‍↕️

역시 수학은 어려워 근데 재밌어