BOJ 1748. 수 이어 쓰기 1
🙇♀️[Silver IV] 수 이어 쓰기 1 - 1748
성능 요약
메모리: 2208 KB, 시간: 0 ms
분류
구현, 수학
제출 일자
2023년 12월 21일 17:53:16
문제 설명
1부터 N까지의 수를 이어서 쓰면 다음과 같이 새로운 하나의 수를 얻을 수 있다.
1234567891011121314151617181920212223...
이렇게 만들어진 새로운 수는 몇 자리 수일까? 이 수의 자릿수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N(1 ≤ N ≤ 100,000,000)이 주어진다.
출력
첫째 줄에 새로운 수의 자릿수를 출력한다.
🚀풀이
n의 자리수를 계산하고 n-1까지의 자리수들은 수학적 계산을 통해 구했다.
예를 들어 123이란 숫자가 있다고 하자.
1의 자리 -> 1
1~9 : 9 * 1
10의 자리 -> 2
10~99 : 90 * 2
100의 자리 -> 3
100~999 : 900 * 3
123이라면
9 * 1 + 90 * 2 + (123 - 10^2 + 1) * 3
이런 로직으로 계산할 수 있다.
이것을 그대로 구현해보면 아래와 같다.
int N, res = 0;
int digit_count(int num)
{
int res = 0;
while (num > 0)
{
num /= 10;
res++;
}
return res;
}
void solve()
{
cin >> N;
int temp = digit_count(N);
// n-1자릿수까지는 수학적 계산을 통해 구하기
for (int i = 1; i < temp; ++i)
{
res += 9 * pow(10, i - 1) * i;
}
// n자릿수는 직접 구해야한다.
int num = N - (pow(10, temp - 1)) + 1; // + 1을 해야된다. 123-100은 23인데 3자리수는 24개니까.
num *= temp;
res += num;
cout << res << '\n';
}
pow함수는 거듭제곱을 해주는 함수인데, pow를 사용할 때는 math.h 헤더를 include해주어야한다.
vs에서는 iostream이 있어서 에러가 안나지만 백준에 답을 적을 때, math.h가 없으면 컴파일 에러가 난다.
🚀전체 코드
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <math.h>
using namespace std;
int N, res = 0;
int digit_count(int num)
{
int res = 0;
while (num > 0)
{
num /= 10;
res++;
}
return res;
}
void solve()
{
cin >> N;
int temp = digit_count(N);
for (int i = 1; i < temp; ++i)
{
res += 9 * pow(10, i - 1) * i;
}
int num = N - (pow(10, temp - 1)) + 1;
num *= temp;
res += num;
cout << res << '\n';
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
//freopen("input.txt", "rt", stdin);
solve();
return 0;
}