코딩 공부

[백준] 1748번 - 수 이어 쓰기 1 (Java)

ZZJJing 2020. 8. 11. 16:54

 

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

 

1748번: 수 이어 쓰기 1

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

www.acmicpc.net

수 이어 쓰기 1 

시간 제한메모리 제한제출정답맞은 사람정답 비율

1 초 128 MB 8690 4668 3927 55.224%

문제

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

1234567891011121314151617181920212223...

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

입력

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

출력

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

예제 입력 1 복사

120

예제 출력 1 복사

252

출처

  • 문제를 만든 사람: author5

알고리즘 분류


 

처음에는 문제를 이해 못했다. ㅋㅋㅋㅋㅋㅋㅋ

맨날 난독증에 걸린 나년.. (ू˃̣̣̣̣̣̣︿˂̣̣̣̣̣̣ ू)

 

옆에 친구가 상세하게 나에게 설명해줘서

 

1 + 2 + 3+ 4 +.... + 11 + 12.... 

숫자를 문자로 인식해서 붙인다는 걸 알았음. 

문제를 이해하는 것도 힘드네.. ( •́ ̯•̀ )

 

 

예쁘고 깔끔하게 

이렇게 그냥 돌리면 나오는데 

'메모리 초과'로 에러가 난다 (ᵒ̌▱ᵒ̌)

 

이때부터 머리에 쥐 남 

일단 끄적여 본다. 

 

 

더보기

끄적끄적.. 

 

// 입력하는 숫자수를 판가름해서 배열에 넣는다. 그 자릿수 0만큼. 
// 그런데  
//---- 일케하면안되고.... 10 -> 2자리 , 100 ->3자리, 10000->4자리.. 
// 100일 경우 => (1 * 9) : 1~9 + 2 * (99- 9)+ 3 * 1 => 192  
// 1000일 경우 => (1*9) + 2 *(99-9) + 3 * (999-99) + 4 * 1 => 2893 
// 120인 경우? 
// (1 * 9) + 2 * (99- 9)+ 3 *(20+1) => 252 

 

1~9 : 9건 : 1자리 --> 입력값 * 1  
10~99 : 90건: 2자리 = 90*2  -->  9 + (입력값-9) * 2  + 2  
100~999: 900건: 3자리 = 900*3  -->  9 + 180 + (입력값-99- >90) 결국 그냥 --> 90 + 입력값 * 3 + 3   
1000~9999건: 4자리 = 9000*4 --> 9 + 180 + 2700 + (입력값 - 999) * 4 + 4...?? 

 

ex1) 120을 넣으면  
9 (1자리: 1~9)+ 90*2 (2자리: 10~99) + 20(나머지) * 3 = 9 + 180 + 60 = 9+240= 249 -252 = 3 차이 (자릿수가 바뀔 때마다 1씩 추가? 하니깐 맞네..ㅎㅎㅎㅎ) 


ex2) 252을 넣는다  
9 (1자리: 1~9) + 180 (2자리: 10~99) + 252-100 * 3 = 9 + 180 + 456 = 645+ 3 = 648  

 

오!? ✧٩(`·ω·´)و✧ 이거구나? 자 이걸 구현해보자 

 

가장 고난스러웠던 부분은 10의 제곱승을 어떻게 만드느냐..?

끙끙거리다 

구글 검색.. ๑°⌓°๑

 

Math.pow(a, b)라는 아름다운 함수를 발견.. 

한 시간 반 동안의 고민은 1분 만에 해결됨.. 

 

그냥 간단히 

1의 자리 더하기 + 2의 자리 더하기 + (입력받은 값 - 10의 제곱승(배열의 자릿수-1) * 배열의자릿수) + 배열의 자리수 

그냥 규칙 찾은 그대로 적용시켰다. ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 

 

일단 더러운 코딩이든 뭐든 난 하는 것에 중점을 두겠다. 

 

 

 

 

이후에 클린 코드도 공부하자.. (ง •̀_•́)ง✧

 

오늘도 뿌듯.. (?)

 

 

 

 

+ 친구들의 클린코드! 

이렇게도 간단해 지는구나 〣(ºΔº)〣