반응형

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이어야 한다.
  • 동일하게 증가한 사이클만큼 각 숫자의 개수를 증가시켜주고, 나머지 페이지에 대한 계산을 해준다.
    • 해당 자리수의 숫자 - 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)
반응형

+ Recent posts