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

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] kμ§„μˆ˜μ—μ„œ μ†Œμˆ˜ 개수 κ΅¬ν•˜κΈ° (level2, python)

개발자 HOON 2022. 9. 12. 17:29

문제 μ„€λͺ…


μ–‘μ˜ μ •μˆ˜ n이 μ£Όμ–΄μ§‘λ‹ˆλ‹€. 이 숫자λ₯Ό kμ§„μˆ˜λ‘œ 바꿨을 λ•Œ, λ³€ν™˜λœ 수 μ•ˆμ— μ•„λž˜ 쑰건에 λ§žλŠ” μ†Œμˆ˜(Prime number)κ°€ λͺ‡ κ°œμΈμ§€ μ•Œμ•„λ³΄λ € ν•©λ‹ˆλ‹€.

 

  • 0P0처럼 μ†Œμˆ˜ μ–‘μͺ½μ— 0이 μžˆλŠ” 경우
  • P0처럼 μ†Œμˆ˜ 였λ₯Έμͺ½μ—λ§Œ 0이 있고 μ™Όμͺ½μ—λŠ” 아무것도 μ—†λŠ” 경우
  • 0P처럼 μ†Œμˆ˜ μ™Όμͺ½μ—λ§Œ 0이 있고 였λ₯Έμͺ½μ—λŠ” 아무것도 μ—†λŠ” 경우
  • P처럼 μ†Œμˆ˜ μ–‘μͺ½μ— 아무것도 μ—†λŠ” 경우
  • 단, PλŠ” 각 μžλ¦Ώμˆ˜μ— 0을 ν¬ν•¨ν•˜μ§€ μ•ŠλŠ” μ†Œμˆ˜μž…λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, 101은 Pκ°€ 될 수 μ—†μŠ΅λ‹ˆλ‹€.

 

예λ₯Ό λ“€μ–΄, 437674을 3μ§„μˆ˜λ‘œ λ°”κΎΈλ©΄ 211020101011μž…λ‹ˆλ‹€. μ—¬κΈ°μ„œ 찾을 수 μžˆλŠ” 쑰건에 λ§žλŠ” μ†Œμˆ˜λŠ” μ™Όμͺ½λΆ€ν„° μˆœμ„œλŒ€λ‘œ 211, 2, 11이 있으며, 총 3κ°œμž…λ‹ˆλ‹€. (211, 2, 11을 kμ§„λ²•μœΌλ‘œ λ³΄μ•˜μ„ λ•Œκ°€ μ•„λ‹Œ, 10μ§„λ²•μœΌλ‘œ λ³΄μ•˜μ„ λ•Œ μ†Œμˆ˜μ—¬μ•Ό ν•œλ‹€λŠ” 점에 μ£Όμ˜ν•©λ‹ˆλ‹€.) 211은 P0 ν˜•νƒœμ—μ„œ 찾을 수 있으며, 2λŠ” 0P0μ—μ„œ, 11은 0Pμ—μ„œ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.

 

μ •μˆ˜ nκ³Ό kκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§‘λ‹ˆλ‹€. n을 kμ§„μˆ˜λ‘œ 바꿨을 λ•Œ, λ³€ν™˜λœ 수 μ•ˆμ—μ„œ 찾을 수 μžˆλŠ” μœ„ 쑰건에 λ§žλŠ” μ†Œμˆ˜μ˜ 개수λ₯Ό return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄ μ£Όμ„Έμš”.

 


μ œν•œμ‚¬ν•­
  • 1 ≤ n ≤ 1,000,000
  • 3 ≤ k ≤ 10

μž…μΆœλ ₯ 예

μž…μΆœλ ₯ 예 μ„€λͺ…
 
μž…μΆœλ ₯ 예 #1

문제 μ˜ˆμ‹œμ™€ κ°™μŠ΅λ‹ˆλ‹€.

 

μž…μΆœλ ₯ 예 #2

110011을 10μ§„μˆ˜λ‘œ λ°”κΎΈλ©΄ 110011μž…λ‹ˆλ‹€. μ—¬κΈ°μ„œ 찾을 수 μžˆλŠ” 쑰건에 λ§žλŠ” μ†Œμˆ˜λŠ” 11, 11 2κ°œμž…λ‹ˆλ‹€. 이와 같이, μ€‘λ³΅λ˜λŠ” μ†Œμˆ˜λ₯Ό λ°œκ²¬ν•˜λ”λΌλ„ λͺ¨λ‘ λ”°λ‘œ μ„Έμ–΄μ•Ό ν•©λ‹ˆλ‹€.

 


풀이 μ½”λ“œ

import math

def change_k_num(num, k):
	# 10μ§„μˆ˜λ₯Ό kμ§„μˆ˜λ‘œ λ³€κ²½ν•˜λŠ” ν•¨μˆ˜
    result = []
    while num // k != 0:
        result.append(num % k)
        num = num // k
    result.append(num)
    return ''.join(map(str, result[::-1]))

def is_prime(num):
	# μ†Œμˆ˜μΈμ§€ νŒλ³„ν•˜λŠ” ν•¨μˆ˜
    if num == 1:
        return False
    elif num == 2 or num == 3:
        return True
    
    for i in range(2, math.ceil(num**0.5) + 1):
        if num % i == 0:
            return False
    return True

def solution(n, k):
    answer = 0
    can_prime = list(change_k_num(n, k).split('0'))
    
    for c in can_prime:
        if c == '':
            continue
        num = int(c)
        if is_prime(num):
            answer += 1
    return answer

μ†Œμˆ˜ νŒλ³„, μ§„μˆ˜ λ³€ν™˜ κ΅¬ν˜„λ¬Έμ œμ΄λ‹€.

문제의 νŠΉμ„±μƒ, λ¬Έμžμ—΄μ„ '0'으둜 λ‚˜λˆ„λ©΄ νŒλ³„ν•΄μ•Ό ν•  10μ§„μˆ˜λ“€μ˜ λͺ©λ‘μ„ ꡬ할 수 μžˆλ‹€.

 

10μ§„μˆ˜λ₯Ό kμ§„μˆ˜λ‘œ λ°”κΎΈλŠ” μ•Œκ³ λ¦¬μ¦˜μ€ λ‹€μŒκ³Ό κ°™λ‹€.

좜처 : https://dojang.io/mod/page/view.php?id=301

2μ§„μˆ˜λ₯Ό μ˜ˆμ‹œλ‘œ λ“€μ—ˆμ§€λ§Œ, kμ§„μˆ˜λΌλ©΄ 2둜 λ‚˜λˆ„μ§€ μ•Šκ³  k둜 λ‚˜λˆ μ£Όλ©΄ λ™μΌν•˜λ‹€.

λ‚˜λˆ΄μ„ λ•Œ λͺ«μ΄ 0이 될 λ•ŒκΉŒμ§€ λ‚˜λˆ„λŠ” 것을 κ³„μ†ν•΄μ„œ λ°˜λ³΅ν•˜κ³ , λ‚˜λ¨Έμ§€λ₯Ό 거꾸둜 읽어주면 μ§„μˆ˜ λ³€ν™˜μ΄ λœλ‹€.

λ”°λΌμ„œ κ΅¬ν˜„ν•  λ•Œ, λ‚˜λ¨Έμ§€λ₯Ό κ³„μ†ν•΄μ„œ list에 appendν•˜κ³ ,

λͺ«μ΄ 0이 되면 list[::-1]둜 λ’€μ§‘μ–΄μ„œ κ΅¬ν•œλ‹€.

 

μ†Œμˆ˜ νŒλ³„ μ•Œκ³ λ¦¬μ¦˜μ€ μ‹œκ°„ λ³΅μž‘λ„μ— 맞게 ꡬ할 수 μžˆλŠ” λ§Žμ€ 방법이 μžˆλ‹€.

ν•„μžκ°€ κ΅¬ν˜„ν•œ 것은 O(N**0.5)의 μ‹œκ°„ λ³΅μž‘λ„λ₯Ό κ°€μ‘Œλ‹€.

 

일단, O(N)의 μ‹œκ°„ λ³΅μž‘λ„λ‘œ κ΅¬ν•˜λŠ” λ°©λ²•μœΌλ‘œλŠ”, 브루트 포슀둜 ꡬ할 수 μžˆλ‹€.

kλ₯Ό 2λΆ€ν„° kκΉŒμ§€ λ‚˜λˆ μ„œ λ‚˜λ¨Έμ§€κ°€ 0인 것이 ν•˜λ‚˜λΌλ„ μžˆλŠ”μ§€ ν™•μΈν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ κ΅¬ν•˜λ©΄ λœλ‹€.

 

ν•˜μ§€λ§Œ, 잘 생각해보면 kλ₯Ό 2λΆ€ν„° k**0.5κΉŒμ§€ λ‚˜λˆ λ„ μ†Œμˆ˜λ₯Ό ꡬ할 수 μžˆλ‹€.

예λ₯Ό λ“€μ–΄, 80의 μ•½μˆ˜λ“€μ„ ν™•μΈν•΄λ³΄μž.

{1, 2, 4, 5, 8, 10, 16, 20, 40, 80}

 

μ•½μˆ˜λŠ” κ³±ν•΄μ„œ kκ°€ λ˜λŠ” 짝을 가지고 있기 λ•Œλ¬Έμ—, 반의 λ²”μœ„κΉŒμ§€λ§Œ 확인해도 λœλ‹€.

κ°€μš΄λ°κ°€ λ˜λŠ” 값은 k ** 2μ΄λ―€λ‘œ, μ—¬κΈ°κΉŒμ§€ ν™•μΈν•˜λ©΄ μ‹œκ°„λ³΅μž‘λ„κ°€ O(N**0.5)κ°€ λœλ‹€.

def is_prime(num):
	# μ†Œμˆ˜μΈμ§€ νŒλ³„ν•˜λŠ” ν•¨μˆ˜
    if num == 1:
        return False
    elif num == 2 or num == 3:
        return True
    
    for i in range(2, math.ceil(num**0.5) + 1):
        if num % i == 0:
            return False
    return True