ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [λ°±μ€€] 1951 ν™œμž with Python
    PS 2022. 5. 13. 16:32
    728x90
    λ°˜μ‘ν˜•

    πŸ“Œ BOJ 1951 ν™œμž

    πŸ’‘ 쑰건

    1. N(1 ≀ N ≀ 2,000,000,000)

    2. κ°€λ‚˜λ‹€λΌλŠ” 글씨λ₯Ό μ“°κΈ° μœ„ν•΄μ„œλŠ” 3개의 ν™œμžκ°€ ν•„μš”ν•˜λ‹€.
      Nμ΄ν•˜μ˜ μžμ—°μˆ˜λ₯Ό ν™œμžλ‘œ ν‘œν˜„ν•˜κΈ° μœ„ν•΄μ„œλŠ” λͺ‡ 개의 ν™œμžκ°€ ν•„μš”ν•œμ§€ κ΅¬ν•˜λŠ” 문제

    3. 10μ΄ν•˜μ˜ μžμ—°μˆ˜λ₯Ό ν™œμžλ‘œ ν‘œν˜„ν•˜λ €λ©΄ 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 0 μ΄λ ‡κ²Œ 11개의 ν™œμžκ°€ ν•„μš”ν•˜λ‹€.

    4. 첫째 쀄에 ν•„μš”ν•œ ν™œμžμ˜ 수λ₯Ό 1234567둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό 좜λ ₯.

    5. μˆ˜ν•™ μœ ν˜•μ˜ 문제

    πŸ–₯ μ†ŒμŠ€ μ½”λ“œ

    n = int(input())
    s = [0 for i in range(10)]
    point = 1
    while n != 0:
        while n % 10 != 9:
            for i in str(n):
                s[int(i)] += point
            n -= 1
        if n < 10:
            for i in range(n + 1):
                s[i] += point
            s[0] -= point
            break
        else:
            for i in range(10):
                s[i] += (n // 10 + 1) * point
        s[0] -= point
        point *= 10
        n //= 10
    
    print(sum(s) % 1234567)

    πŸ”– 예제 및 μ‹€ν–‰κ²°κ³Ό

    예제

    10

    μ‹€ν–‰κ²°κ³Ό

    11

    ⌨️ 문제 풀이

    1. 일단 λ¨Όμ €, N의 크기λ₯Ό ν™•μΈν•΄λ³΄μž. N이 무렀 2얡을 λ„˜μ–΄ 천μž₯을 뚫고 20얡이닀.
      1λΆ€ν„° NκΉŒμ§€ μ˜¬λΌκ°€λ©΄μ„œ 각 숫자λ₯Ό μ„Έμ–΄λ³Έλ‹€λŠ” μ•„μ΄λ””μ–΄μ—μ„œ λͺ»λ²—μ–΄λ‚˜ μ½”λ“œλ₯Ό μ§°λ‹€λ©΄ λ°˜μ„±ν•΄μ•Όν•˜λ©°, λ‚œ λ°˜μ„±ν•˜κ³  μžˆλ‹€.

    2. 0λΆ€ν„° 9κΉŒμ§€ λͺ‡ 개의 숫자λ₯Ό μ‚¬μš©ν–ˆλŠ”μ§€ μ €μž₯ν•  리슀트 sλ₯Ό λ§Œλ“ λ‹€.

    3. N이 0 이 될 λ•ŒκΉŒμ§€ λ°˜λ³΅λ¬Έμ„ λŒλ €μ£Όλ©΄λ˜λŠ”λ°,

      1. N 을 10으둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€κ°€ 9κ°€ 아닐 경우, n을 λ¬Έμžμ—΄λ‘œ λ§Œλ“€μ–΄ s[ν•΄λ‹Ή 숫자]에 point 만큼 숫자λ₯Ό 더해쀀닀.
        κ·Έ ν›„ n - 1 을 ν•΄μ€€λ‹€. 이 μž‘μ—…μ€ 10으둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€κ°€ 9κ°€ 될 λ•ŒκΉŒμ§€ λ°˜λ³΅ν•œλ‹€.
        이 ν›„, μ•„λž˜μ˜ 두가지 쑰건을 λ‹€μ‹œ μ‚΄νŽ΄λ³Έλ‹€.

      2. N 을 10으둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€κ°€ 9이며 10보닀 μž‘μ„ 경우, 각 자리의 값을 point 만큼 λŠ˜λ €μ€€λ‹€ 0에 ν•΄λ‹Ήν•˜λŠ” μˆ«μžλŠ” pointλ₯Ό λΉΌμ€€λ‹€.
        이 μž‘μ—…μ΄ μ™„λ£Œλ˜λ©΄ break.

      3. N 을 10으둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€κ°€ 9이며 10보닀 클 경우, sλ₯Ό μˆœνšŒν•˜λ©΄μ„œ s[i]의 값을 (n // 10 + 1) * point 만큼 λŠ˜λ €μ€€λ‹€.

      이 세가지 쑰건문에 ν•΄λ‹Ήν•˜λŠ” μž‘μ—…μ„ μ™„λ£Œν•˜κ³ , s[0] - point, point의 값을 * 10, n // 10 을 ν•΄μ€€λ‹€.

    4. (3-1) 쑰건은 1의 자리 수λ₯Ό 9κ°€ μ•„λ‹Œ 수둜 λ§Œλ“€κΈ° μœ„ν•΄μ„œ ν•˜λŠ” μž‘μ—…μ΄λ‹€.
      9λŠ” 0~9κΉŒμ§€ ν•œλ²ˆμ”© λͺ¨λ‘ μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

    5. (3-2) 쑰건은 N이 ν•œμžλ¦¬ 수둜 λ–¨μ–΄μ‘Œμ„ λ•Œ, μ‚¬μš©ν•  쑰건이닀. ꡳ이 뭘 계산할 ν•„μš”μ—†μ΄ s의 각 μ›μ†Œμ— pointλ₯Ό 더해주면 λœλ‹€.

    λ°˜μ‘ν˜•

    λŒ“κΈ€

Designed by Tistory.