반응형
https://www.acmicpc.net/problem/1019
1019번: 책 페이지
첫째 줄에 0이 총 몇 번 나오는지, 1이 총 몇 번 나오는지, ..., 9가 총 몇 번 나오는지를 공백으로 구분해 출력한다.
www.acmicpc.net
해결 방법 : 규칙
- 별 다른 방법이 떠오르지 않아 규칙을 찾아서 풀었다.
- 자리수를 1의 자리수 = 1, 10의 자리수 = 2, 100의 자리수 = 3 이라고 한다면,
- 각 자리수에서 발생하는 0~9 개수는 number // 10**(자리수)를 한 사이클로 동일하게 증가하는데 이 때의 증가량은 10**(자리수 - 1)과 같다.
- 다만, 0의 경우는 추가적으로 고려해주었다.
- ex. 105의 10의 자리수를 계산한다면, number // 10**(자리수)는 1이고, 증가량이 10**(자리수 - 1)로 10이다. 하지만 0은 109까지 존재해야 한 사이클이므로, 증가량이 6이어야 한다.
- 다만, 0의 경우는 추가적으로 고려해주었다.
- 동일하게 증가한 사이클만큼 각 숫자의 개수를 증가시켜주고, 나머지 페이지에 대한 계산을 해준다.
- 해당 자리수의 숫자 - 1까지는 10**(자리수 - 1)만큼 증가, 해당 자리수의 숫자는 하위에 있는 나머지값 만큼 증가
import sys
input = sys.stdin.readline
def solution(n):
counts = [0] * 10
for i in range(len(str(n))):
for j in range(10):
counts[j] += (n // (10**(i + 1))) * 10**i
if i > 0 and n % (10**(i + 1)) // (10**(i)) == 0: # 해당 자리수가 0이면 0의 개수는 따로 고려해준다.
counts[0] -= 10**(i) - (n % (10**(i))) - 1
remain = (n % (10**(i + 1))) // (10**(i)) # 사이클로 처리되지 않은 부분
for j in range(1, remain + 1):
if j < remain:
counts[j] += 10**(i)
else:
counts[j] += n % 10**(i) + 1
counts = [str(i) for i in counts]
return ' '.join(counts)
if __name__ == '__main__':
n = int(input())
result = solution(n)
print(result)반응형
'IT study > 알고리즘 문제 풀이' 카테고리의 다른 글
| 2021 Dev-Matching: 웹 백엔드 개발자(상반기) 문제풀이 (0) | 2021.05.24 |
|---|---|
| 매출 하락 최소화 (0) | 2021.05.19 |
| 백준 1016 : 제곱ㄴㄴ수 (0) | 2021.05.17 |
| 백준 1029 : 그림 교환 (0) | 2021.05.16 |
| 백준 2098 : 외판원 순회 (0) | 2021.05.16 |