🙇‍♀️[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;
}