기록하는삶
[코딩 테스트 연습(파이썬/Python)] 백준(BOJ) 1019번 _ 책 페이지 본문
백준(Python)/수학(Mathematics)
[코딩 테스트 연습(파이썬/Python)] 백준(BOJ) 1019번 _ 책 페이지
mingchin 2022. 4. 22. 02:04728x90
반응형
https://www.acmicpc.net/problem/1019
1019번: 책 페이지
첫째 줄에 0이 총 몇 번 나오는지, 1이 총 몇 번 나오는지, ..., 9가 총 몇 번 나오는지를 공백으로 구분해 출력한다.
www.acmicpc.net
[문제]
지민이는 전체 페이지의 수가 N인 책이 하나 있다. 첫 페이지는 1 페이지이고, 마지막 페이지는 N 페이지이다. 각 숫자가 전체 페이지 번호에서 모두 몇 번 나오는지 구해보자.
[입력]
첫째 줄에 N이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이다.
[출력]
첫째 줄에 0이 총 몇 번 나오는지, 1이 총 몇 번 나오는지, ..., 9가 총 몇 번 나오는지를 공백으로 구분해 출력한다.
[아이디어]
1) 십진 수 단위로 분리해서 합하는 전략을 세웠다.
(543212345 = 500000000+ 40000000 + 3000000 + 200000 + 10000 + 2000 + 300 + 40 + 5)
2) 위 예시에서 다시 500000000까지의 숫자 갯수를 구할 때, 앞 자리가 5보다 작을 때와 5일때를 구분하여, 맨 앞 자리와 나머지 자리의 숫자 개수를 각각 따로 구해 더해주었다. 이때 맨 앞 자리가 0일 수는 없기 때문에, 맨 앞자리가 0일 때를 가정하고 더한 0의 개수는 빼준다. (처음에 0을 예외로 두려다가 고생했는데, 맨 앞이 0일 수 있다 치고 더하고 다시 빼주는게 훨씬 편했다.)
3) 2)의 과정을 모든 십진 수 단위의 수에 대해 수행하면 끝
d=[0 for _ in range(10)]
n=input();k=len(n)
for x in n:
k-=1
for i in range(int(x)):
d[i]+=10**k
for j in range(10):
if k>=1:
d[j]+=(10**(k-1))*k
d[0]-=10**k
if k:
d[int(x)]+=(int(''.join(n[-k:]))+1)
else:
d[int(x)]+=1
print(*d)
728x90
반응형
'백준(Python) > 수학(Mathematics)' 카테고리의 다른 글
[코딩 테스트 연습(파이썬/Python)] 백준(BOJ) 17371번 _ 이사 (0) | 2022.04.21 |
---|---|
[코딩 테스트 연습(파이썬/Python)] 백준(BOJ) 15824번 _ 너 봄에는 캡사이신이 맛있단다 (0) | 2022.04.19 |
[코딩 테스트 연습(파이썬/Python)] 백준(BOJ) 11402번 _ 이항 계수 4 (0) | 2022.04.14 |
[코딩 테스트 연습(파이썬/Python)] 백준(BOJ) 11401번 _ 이항 계수 3 (0) | 2022.04.12 |
[코딩 테스트 연습(파이썬/Python)] 백준(BOJ) 15712번 _ 등비수열 (0) | 2022.04.10 |