본문 바로가기

백준 문제풀이 코드저장소/Platinum

Baekjoon 1019. 책 페이지 / Python

728x90

1019. 책 페이지

난이도 : 플래티넘 5
소요 시간 : 20분
날짜 : 2024.12.31
언어 : 파이썬
알고리즘 유형 : 구현, 수학

설명 보기전에 문제 풀어보러 가기

1. 문제 설명

  1. 1부터 n까지 [0, 1 ,2, ,,, 9]가 각각 몇 번 나오는지 구하기
    • 1 <= n <= $10^9$

2. 해결 방식

  1. 자리수 별로 반복하기. (최대 9번)
  2. factor = 1 ($10^0$)부터 시작해서 10씩 곱해가며 반복한다.
  3. 현재 자리를 기준으로, 현재자리 숫자와 더 높은 자리 숫자, 더 낮은 자리 숫자로 구분한다.
  4. 0부터 9까지 확인하여 결과값에 더해준다.
    • 현재자리수보다 작은 수 : (높은자리 숫자 + 1) * factor를 더 해준다.
    • 현재자리 수 : 높은자리 숫자 * factor + 낮은자리 숫자 + 1을 더 해준다.
    • 현재자리 수보다 큰 수 : 높은자리 숫자 * factor를 더 해준다.
    • 0부터 9까지 다 돌았으면 res[0]을 factor만큼 빼준다.

3. 정답 코드

import sys
# input = sys.stdin.readline
sys.stdin = open("C:/Users/ghtjd/Desktop/tmp/python/input.txt", "r")

def sol(n: str):
    res = [0] * 10  
    n = int(n)

    factor = 1 

    while n >= factor:
        current = (n // factor) % 10  # 현재 자리 숫자
        higher = n // (factor * 10)  # 더 높은 자리 숫자
        lower = n % factor  # 더 낮은 자리 숫자

        for i in range(10):
            if i < current:
                res[i] += (higher + 1) * factor
            elif i == current:
                res[i] += higher * factor + (lower + 1)
            else:
                res[i] += higher * factor

        res[0] -= factor

        factor *= 10

    print(*res)

sol(input())
반응형