문제 링크
https://www.acmicpc.net/problem/1748
문제:
1부터 N까지의 수를 이어서 쓰면 다음과 같이 새로운 하나의 수를 얻을 수 있다.
1234567891011121314151617181920212223...
이렇게 만들어진 새로운 수는 몇 자리 수일까? 이 수의 자릿수를 구하는 프로그램을 작성하시오.
입력:
첫째 줄에 N(1 ≤ N ≤ 100,000,000)이 주어진다.
출력:

ex) 15인경우 123456789101112131415 = 21자리가 되는 것이다.
문제 해결 방안:
처음에는 1부터 카운팅하면서 숫자를 더하는 방향을 모두가 생각하겠지만, 시간초과 기준이 0.5 이내 이므로 이 방법이 아닌 다른 방법을 생각하였다.
결국 만약 3자리 수이면 2자리 수 까지 모두 구하고 나머지 3자리 수를 카운팅 하는 방법을 생각했다.
예를들면 Input이 3자리 수 120이라 생각해 보자
1자리 카운팅(1~9) = 9*(10^0(이전 자리)) * 1(자리) =9
2자리 카운팅(10~99)= 9*(10^1(이전 자리)) * 2(자리)= 90 * 2 = 180 (여기까지 이전 자리 수 카운팅)
결국 3자리라면 이전 자리(1~2)들의 공식은 9 * 10^(이전자리 수) * 현재 구하는 자리수로 도출할 수 있다
나머지 카운팅 (100~120) 21개 = (입력숫자 - 10^이전 자리 수 + 1) * 현재 구하는 자리 수 = (120 - 10^2 +1) * 3(자리) = 63
결론적으로 252가 정답이 되는 것이다.
코드:
위에 방식을 그대로 코드로 구현하면 다음과 같다.
import java.util.Scanner;
public class Main {
public static int Counting(int num){
int count=0;
int length=String.valueOf(Math.abs(num)).length();//자리수
//자리수가 1이면 즉시 리턴
if(length==1){
return num;
}
//3자리라면 이전 1자리 2자리 개수 모두 카운팅
for(int i=0; i<length-1; i++){
count+=9*Math.pow(10,i)*(i+1);
}
//3자리 수만 카운팅
count += (num - Math.pow(10, length - 1) + 1) * length;
//결과 리턴
return count;
}
public static void main(String[] args) {
int num;
//수 입력
Scanner sc = new Scanner(System.in);
num = sc.nextInt();
//결과 출력
System.out.println(Counting(num));
}
}
결론:
문제만 봤을땐 너무 쉬워 보였지만 해당 규칙을 도출하는 과정에서 시간이 좀 들었다.
자료들을 여러개 찾아 본 결과 구하는 방식들이 제 각각이며 이해가 되지 않는 코드들도 많았다.
다른 코드에 휘둘리지 않고, 자신과 맞는 방식으로 구현하는 것을 추천한다.
'코딩 테스트' 카테고리의 다른 글
| [백준] 2583 영역 구하기 (JAVA) (2) | 2025.07.02 |
|---|---|
| [백준] 2468 안전 영역 (JAVA) (0) | 2025.07.02 |
| [백준] 1012 유기농 배추 (JAVA) (3) | 2025.07.01 |
| [백준] 2178 미로탐색 (JAVA) (3) | 2025.06.30 |
| [백준] 1260 DFS와 BFS (3) | 2025.06.27 |