지구정복

[수학] 백준 - 수 이어쓰기 1 본문

데이터 엔지니어링 정복/Algorithm

[수학] 백준 - 수 이어쓰기 1

eeaarrtthh 2021. 8. 23. 14:29
728x90
반응형

https://www.acmicpc.net/problem/1748

 

1748번: 수 이어 쓰기 1

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

www.acmicpc.net

 

-문제해설

9이하이면 1자리

99이하이면 2자리

999이하이면 3자리

...

이므로 i가 1부터 입력값인 n까지 반복문을 돌면서

i가 10일 때, i가 100일 때, i가 1000일 때....

더해지는 수 tmp를 1씩 증가시킨다.

 

그리고 ans에 누적해서 더한다.

ans += tmp;

 

 

파이썬의 경우 규칙을 이용해서 풀었다.

예를 들어 n이 1002일 경우

1~9까지의 합은 9

10~99까지의 합은 180

100~999까지의 합은 2700

 

여기서 규칙을 확인해보면

1~9 : 9 * 1 * 10^0

10~99 : 9 * 2 * 10^1

100~999 : 9 * 3 * 10^2

 

따라서 입력받은 n이 1002이므로 999까지의 합을 구한 뒤 1000, 1001, 1002 의 자리수를 더해주면 된다.

1000, 1001, 1002 의 자리수를 더하는 방법은

4 * ( 1002 - 1000 + 1  ) = 4 * 3  = 12

이를 식으로 나타내면 아래와 같다.

 

len(n) * ( ( n - 10^(len(n)-1) ) + 1 ) = 4 * ( 1002 - ( 10^3 ) ) + 1 = 4 * ( 2 ) + 1 = 12

 

 

-자바

package bruteforce;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class BJ1748 {

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt( br.readLine() );
		
		int ans = 0;
		int tmp = 1;
		int len = 10;
		for( int i=1; i<=n; i++ ) {
			if( i == len ) {
				tmp++;
				len *= 10;
			}
			ans += tmp;
		}
		System.out.println( ans );
		
	}
}

 

-파이썬

n = int(input())
s = len(str(n))
ans = 0
for i in range( 1, s ):
    ans += 9 * i * 10**(i-1)
print( ans + ( s * ( ( n - 10**(s-1) ) + 1 ) ) )
728x90
반응형
Comments