기록하는삶

[코딩 테스트 연습(파이썬/Python)] 백준(BOJ) 1019번 _ 책 페이지 본문

백준(Python)/수학(Mathematics)

[코딩 테스트 연습(파이썬/Python)] 백준(BOJ) 1019번 _ 책 페이지

mingchin 2022. 4. 22. 02:04
728x90
반응형

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
반응형