별의 공부 블로그 🧑🏻‍💻
728x90
728x170

문제

1부터 N까지의 수를 이어서 쓰면 다음과 같이 새로운 하나의 수를 얻을 수 있다.


1234567891011121314151617181920212223...


이렇게 만들어진 새로운 수는 몇 자리 수일까? 이 수의 자릿수를 구하는 프로그램을 작성하시오.


 

입력

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

 

 

출력

첫째 줄에 새로운 수의 자릿수를 출력한다.

 

 

예제 입력 1

 120

 

예제 출력 1

 252

 

 

출처

· 문제를 만든 사람: author5

 

 

알고리즘 분류

· 브루트 포스

· 구현

 

 

코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
using namespace std;
 
int main() {
    int N, size;
 
    cin >> N;
    
    if ((N >= 1&& (N <= 9)) {
        size = 1 * N;
    }
    else if ((N >= 10&& (N <= 99)) {
        size = 9 * 1 + (N - 9* 2;
    }
    else if ((N >= 100&& (N <= 999)) {
        size = 9 * 1 + 90 * 2 + (N - 99* 3;
    }
    else if ((N >= 1000&& (N <= 9999)) {
        size = 9 * 1 + 90 * 2 + 900 * 3 + (N - 999* 4;
    }
    else if ((N >= 10000&& (N <= 99999)) {
        size = 9 * 1 + 90 * 2 + 900 * 3 + 9000 * 4 + (N - 9999* 5;
    }
    else if ((N >= 100000&& (N <= 999999)) {
        size = 9 * 1 + 90 * 2 + 900 * 3 + 9000 * 4 + 90000 * 5 + (N - 99999* 6;
    }
    else if ((N >= 1000000&& (N <= 9999999)) {
        size = 9 * 1 + 90 * 2 + 900 * 3 + 9000 * 4 + 90000 * 5 + 900000 * 6 + (N - 999999* 7;
    }
    else if ((N >= 10000000&& (N <= 99999999)) {
        size = 9 * 1 + 90 * 2 + 900 * 3 + 9000 * 4 + 90000 * 5 + 900000 * 6 + 9000000 * 7 + (N - 9999999* 8;
    }
    else if (N == 100000000) {
        size = 9 * 1 + 90 * 2 + 900 * 3 + 9000 * 4 + 90000 * 5 + 900000 * 6 + 9000000 * 7 + 90000000 * 8 + 9;
    }
    
    cout << size << endl;
    
    return 0;
}






이 문제를 string을 이용하여 문제를 풀어보려고 했었다.

아래는 string을 이용하여 이 문제를 풀기 위해 내가 접근했던 방식을 나타낸 코드이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 메모리 초과
 
#include <iostream>
#include <string>
using namespace std;
 
int main() {
    int N;
    string value;
    
    cin >> N;
    
    for (int i = 1; i <= N; i++) {
        value.insert(value.length(), to_string(i));
    }
    cout << value.length() << endl;
    
    return 0;
}



insert()함수를 사용하여 string value의 끝 부분에 숫자들을 계속 삽입해주고, 최종적으로 string value의 길이값을 출력하는 방식으로 문제를 풀려고 하였다.

하지만 메모리 초과로 인하여 문제를 풀 수 없었다.


그래서 복잡한 알고리즘을 이용하지 않고, 간단하고 빠르게 이 문제를 해결할 수 있는 방법을 찾아내었다.

그 방법은 규칙을 발견하는 것이다.

아래는 내가 발견한 규칙이다.


1
2
3
4
5
6
7
8
9
1~9 : 9                                                                                           > 1*N        
10~99 : 9 + 90*2 = 189                                                                            > 9*1 + (N-10+1)*2 = 9 + (N-9)*2
100~999 : 9 + 90*2 + 900*3                                                                        > 9*1 + 90*2 + (N-100+1)*3 = 9 + 90*2 + (N-99)*3
1000~9999 : 9 + 90*2 + 900*3 + 9000*4                                                             > 9*1 + 90*2 + 900*3 + (N-999)*4 
10000~99999 : 9 + 90*2 + 900*3 + 9000*4 + 90000*5                                                 > 9*1 + 90*2 + 900*3 + 9000*4 + (N-9999)*5            
100000~999999 : 9 + 90*2 + 900*3 + 9000*4 + 90000*5 + 900000*6                                    > 9*1 + 90*2 + 900*3 + 9000*4 + 90000*5 + (N-99999)*6
1000000~9999999 : 9 + 90*2 + 900*3 + 9000*4 + 90000*5 + 900000*6 + 9000000 * 7       > 9*1 + 90*2 + 900*3 + 9000*4 + 90000*5 + 999999*6 + (N-999999)*7
10000000~99999999 : 9 + 90*2 + 900*3 + 9000*4 + 90000*5 + 900000*6 + 9000000 * 7 + 90000000 * 8   > 9*1 + 90*2 + 900*3 + 9000*4 + 90000*5 + 999999*6 + 9999999*7 + (N-9999999)*8   
100000000 : 9 + 90*2 + 900*3 + 9000*4 + 90000*5 + 900000*6 + 9000000 * 7 + 90000000 * 8 + 9 > 9*1 + 90*2 + 900*3 + 9000*4 + 90000*5 + 999999*6 + 9999999*7 + 99999999*8 + 9 


이 규칙을 이용하여 이 문제를 해결할 수 있었다.

728x90
그리드형(광고전용)

'Problem Solving > BaekJoon Online Judge' 카테고리의 다른 글

[BOJ2947][C++] 나무 조각  (0) 2020.06.05
[BOJ2753][C++] 윤년  (0) 2019.09.21
[BOJ1181][C++] 단어 정렬  (2) 2018.11.17
[BOJ16430][C++] 제리와 톰  (0) 2018.11.13
[BOJ2884][C++] 알람 시계  (0) 2018.10.03
[BOJ5063][C++] TGN  (0) 2018.10.03
[BOJ2822][C++] 점수 계산  (0) 2018.10.03
[BOJ10707][C++] 수도요금  (0) 2018.10.03
⚠️AdBlock이 감지되었습니다. 원할한 페이지 표시를 위해 AdBlock을 꺼주세요.⚠️


📖 Contents 📖