발자취

[백준 / C언어] Day55. 수 이어 쓰기 1 (1748) 본문

코딩테스트/Daily Coding (C, C++)

[백준 / C언어] Day55. 수 이어 쓰기 1 (1748)

해린 2024. 7. 28. 02:57

2024. 07. 28 - 코딩테스트 스터디 Day55

 
 

01. 문제

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

1234567891011121314151617181920212223...

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

02. 입력

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

 
 

03. 출력

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

04-1. 예제 입력 1

5

 
 

04-2. 예제 출력 1

5

 
 

05-1. 예제 입력 2

15

 
 

05-2. 예제 출력 2

21

 
 

06-1. 예제 입력 3

120

 
 

06-2. 예제 출력 3

252

 
 

07. 풀이 및 답 - 첫 번째 코드

우선 문제를 풀기 전 각 자릿수의 숫자 개수를 알아보았다.

  • 1자리: 9개 (~9) 
  • 2자리: 90개 (~99)
  • 3자리: 900개 (~999)
  • 4자리: 9000개
  • 5자리: 90000개
  • 6자리: 900000개
  • 7자리: 9000000개
  • 8자리: 90000000개
  • 9자리: 900000000개

 

#include <stdio.h>

int main() {
	int n;
	scanf("%d", &n);

	int answer = 0;
	int length = 1;
	long long count = 9;

	while (n > 0) {
		if (n > count) {
			answer += length * count;
			n -= count;
		}
		else {
			answer += length * n;
			break;
		}
		length++;
		count *= 10;
	}

	printf("%d\n", answer);
	return 0;
}

length는 현재 자릿수의 길이, count는 각 자릿수의 숫자 개수이다.
 
n이 0보다 큰 동안 반복문을 돈다.
n이 현재 자릿수 범위의 숫자 개수보다 크면, 자릿수의 길이(length)에 현재 자릿수 범위의 숫자 개수(count)를 곱하여 answer에 더해준다. 그 뒤, n에서 현재 자릿수 범위의 숫자 개수(count)를 빼준다.
 
n이 현재 자릿수 범위의 숫자 개수보다 작다면, 남아있는 숫자 n과 자릿수의 길이(length)를 곱하여 answer에 더해주고 반복문을 빠져나간다.
 
length를 1씩 증가시키고, count에 10씩 곱하여 다음 자릿수 범위로 이동한다.
 
 
동작에 대한 예시

n이 584라고 가정한다.

1️⃣ 첫 번째 반복 (1자리 숫자)
1. 584 > 9이므로 answer += 1 * 9
→ 1자리 숫자의 개수(9개)를 셈

2. n -= 9; (n = 575)
→ 센 숫자의 개수는 n에서 빼줌

3. length++; (length = 2)
→ 1자리 숫자는 다 셌으므로 2자리 숫자를 세기 위해 length를 증가시킴

4. count *= 10; (count = 90)
→ 2자리 숫자는 총 90개 존재


2️⃣ 두 번째 반복 (2자리 숫자)
1. 575 > 90이므로 answer += 2 * 90
 → 2자리 숫자의 개수(90개)를 셈 (2자리 숫자이므로 차지하는 칸이 2칸이라 2를 곱함)

2. n -= 90; (n = 485)
 → 센 숫자의 개수는 n에서 빼줌

3. length++; (length = 3)
→ 3자리 숫자를 세기 위해 length를 증가시킴

4. count *= 10; (count = 900)
→ 3자리 숫자는 총 900개 존재


3️⃣ 세 번째 반복 (3자리 숫자)
1. 485 > 900은 참이 아니므로 answer += 3 * 485
 → 3자리 숫자의 개수(485개)를 셈

2. break로 반복문을 빠져나감


💎 요약 💎
1자리 숫자: 1부터 9까지 9개, 총 9자릿수 추가
2자리 숫자: 10부터 99까지 90개, 총 180자릿수 추가
3자리 숫자: 100부터 584까지 485개, 총 1455자릿수 추가

 
 

정답!