🐍 μ½”λ”©ν…ŒμŠ€νŠΈ λŒ€λΉ„ : PS

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] [3μ°¨] nμ§„μˆ˜ κ²Œμž„ (level2, python)

개발자 HOON 2022. 9. 13. 22:23

문제 μ„€λͺ…

νŠœλΈŒκ°€ ν™œλ™ν•˜λŠ” μ½”λ”© λ™μ•„λ¦¬μ—μ„œλŠ” μ „ν†΅μ μœΌλ‘œ ν•΄μ˜€λŠ” κ²Œμž„μ΄ μžˆλ‹€. 이 κ²Œμž„μ€ μ—¬λŸ¬ μ‚¬λžŒμ΄ λ‘₯κΈ€κ²Œ μ•‰μ•„μ„œ 숫자λ₯Ό ν•˜λ‚˜μ”© μ°¨λ‘€λŒ€λ‘œ λ§ν•˜λŠ” κ²Œμž„μΈλ°, κ·œμΉ™μ€ λ‹€μŒκ³Ό κ°™λ‹€.

 

  1. 숫자λ₯Ό 0λΆ€ν„° μ‹œμž‘ν•΄μ„œ μ°¨λ‘€λŒ€λ‘œ λ§ν•œλ‹€. 첫 번째 μ‚¬λžŒμ€ 0, 두 번째 μ‚¬λžŒμ€ 1, … μ—΄ 번째 μ‚¬λžŒμ€ 9λ₯Ό λ§ν•œλ‹€.
  2. 10 μ΄μƒμ˜ μˆ«μžλΆ€ν„°λŠ” ν•œ μžλ¦¬μ”© λŠμ–΄μ„œ λ§ν•œλ‹€. 즉 μ—΄ν•œ 번째 μ‚¬λžŒμ€ 10의 첫 자리인 1, 열두 번째 μ‚¬λžŒμ€ λ‘˜μ§Έ 자리인 0을 λ§ν•œλ‹€.

 

μ΄λ ‡κ²Œ κ²Œμž„μ„ μ§„ν–‰ν•  경우,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 0, 1, 1, 1, 2, 1, 3, 1, 4, …
순으둜 숫자λ₯Ό λ§ν•˜λ©΄ λœλ‹€.

 

ν•œνŽΈ μ½”λ”© 동아리 일원듀은 컴퓨터λ₯Ό λ‹€λ£¨λŠ” μ‚¬λžŒλ‹΅κ²Œ μ΄μ§„μˆ˜λ‘œ 이 κ²Œμž„μ„ μ§„ν–‰ν•˜κΈ°λ„ ν•˜λŠ”λ°, 이 κ²½μš°μ—λŠ”
0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, …
순으둜 숫자λ₯Ό λ§ν•˜λ©΄ λœλ‹€.

 

μ΄μ§„μˆ˜λ‘œ μ§„ν–‰ν•˜λŠ” κ²Œμž„μ— μ΅μˆ™ν•΄μ Έ μ§ˆλ €κ°€λ˜ μ‚¬λžŒλ“€μ€ μ’€ 더 λ‚œμ΄λ„λ₯Ό 높이기 μœ„ν•΄ μ΄μ§„λ²•μ—μ„œ μ‹­μœ‘μ§„λ²•κΉŒμ§€ λͺ¨λ“  μ§„λ²•μœΌλ‘œ κ²Œμž„μ„ μ§„ν–‰ν•΄λ³΄κΈ°λ‘œ ν–ˆλ‹€. 숫자 κ²Œμž„μ΄ μ΅μˆ™ν•˜μ§€ μ•Šμ€ νŠœλΈŒλŠ” κ²Œμž„μ— μ Έμ„œ λ²ŒμΉ™μ„ λ°›λŠ” κ΅΄μš•μ„ ν”Όν•˜κΈ° μœ„ν•΄, μžμ‹ μ΄ 말해야 ν•˜λŠ” 숫자λ₯Ό μŠ€λ§ˆνŠΈν°μ— 미리 좜λ ₯ν•΄μ£ΌλŠ” ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€λ €κ³  ν•œλ‹€. 튜브의 ν”„λ‘œκ·Έλž¨μ„ κ΅¬ν˜„ν•˜λΌ.


μž…λ ₯ ν˜•μ‹

 

진법 n, 미리 ꡬ할 숫자의 갯수 t, κ²Œμž„μ— μ°Έκ°€ν•˜λŠ” 인원 m, 튜브의 μˆœμ„œ p κ°€ μ£Όμ–΄μ§„λ‹€.

  • 2 ≦ n β‰¦ 16
  • 0 < t β‰¦ 1000
  • 2 ≦ m β‰¦ 100
  • 1 ≦ p β‰¦ m

좜λ ₯ ν˜•μ‹

 

νŠœλΈŒκ°€ 말해야 ν•˜λŠ” 숫자 t개λ₯Ό 곡백 없이 μ°¨λ‘€λŒ€λ‘œ λ‚˜νƒ€λ‚Έ λ¬Έμžμ—΄. 단, 10~15λŠ” 각각 λŒ€λ¬Έμž A~F둜 좜λ ₯ν•œλ‹€.


μž…μΆœλ ₯ 예제


풀이 μ½”λ“œ

from collections import deque

def change(n, number):
    result = []
    over_decimal = ['A', 'B', 'C', 'D', 'E', 'F']
    
    while number // n != 0:
        temp = number % n
        number = number // n
        if temp >= 10:
            temp = over_decimal[temp-10]
        else:
            temp = str(temp)
        result.append(temp)
        
    if number >= 10:
        result.append(over_decimal[number-10])
    else:
        result.append(str(number))
    return ''.join(result[::-1])

def solution(n, t, m, p):
    answer = []
    number = 0
    count = 0
    while len(answer) != t:
        queue = deque(change(n, number))
        while queue:
            str_num = queue.popleft()
            count += 1
            if (m != p and count % m == p) or (m == p and count % m == 0):
                answer.append(str_num)
            if len(answer) == t:
                break
        number += 1
    return ''.join(answer)

문제λ₯Ό μ΄ν•΄ν•˜λŠ” 데 μ’€ μ‹œκ°„μ΄ 걸릴 수 μžˆλ‹€.

μ‰½κ²Œ λ§ν•˜λ©΄, 0λΆ€ν„° κ³„μ†ν•΄μ„œ λŠ˜μ–΄λ‚˜λŠ” μˆ«μžμ— λŒ€ν•΄ n μ§„μˆ˜λ‘œ λ³€ν™˜ν•œλ‹€.

ν•œ μžλ¦¬μˆ˜μ”© 외쳐야 ν•  λ•Œ, λ‚΄κ°€ 외쳐야 ν•˜λŠ” μˆ«μžμ— λŒ€ν•΄ t회 λ²ˆμ§Έμ— 말 ν•  λ‚΄μš©κΉŒμ§€λ₯Ό λ‹΄μ•„ λ¦¬ν„΄ν•˜λ©΄ λœλ‹€.

 

change ν•¨μˆ˜λŠ” 10μ§„μˆ˜λ₯Ό nμ§„μˆ˜λ‘œ λ³€ν™˜ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€.

 0λΆ€ν„° μ–΄λŠ μˆ«μžκΉŒμ§€ nμ§„μˆ˜λ‘œ λ³€ν™˜ν•΄μ•Ό ν•˜λŠ”μ§€ λͺ¨λ₯΄λ―€λ‘œ, t개의 숫자λ₯Ό 얻을 λ•ŒκΉŒμ§€λ§Œ λ³€ν™˜ν•œλ‹€.

λ³€ν™˜λœ 숫자λ₯Ό 큐에 λ„£κ³ , ν•œ μžλ¦¬μ”© λ½‘μ•„μ„œ λ‚΄ μˆœμ„œμ— λ§žλŠ” 자리만 answer에 λ„£λŠ”λ‹€.

 

λ§ˆμ§€λ§‰μœΌλ‘œ 배열을 λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•΄μ£Όλ©΄ λ¬Έμ œκ°€ μ‰½κ²Œ ν’€λ¦°λ‹€.