julia coding story

[프로그래머스] k진수에서 소수 개수 구하기 Python 본문

카테고리 없음

[프로그래머스] k진수에서 소수 개수 구하기 Python

julia-biolat 2025. 2. 10. 18:31
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/92335

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

위 문제는 시간 초과를 피하는게 키포인트인 문제이다. 

 

알아야할 것

1. 10진수 k진수로 바꾸는 법

- n인 10진수가 있으면 이거를 k로 계속 나눴을 때, 나머지들을 나열한거임. 

자세한건 아래 링크 참조 부탁함.

https://m.blog.naver.com/icbanq/221727893563

 

[진법변환] 2진수,8진수,10진수,16진수 쉽게 변환하는 방법 알아보기!

2024버전 NEW 진법변환 글을 작성했어요! 2진법~16진법, 소수점이 있는 숫자 진법 변환까지 단골질문에 ...

blog.naver.com

 

 

2. 소수 판별 법 (최적화 된 방법)

- 원래 n이 소수인지 아닌지 판별하는 법은 2부터 n-1까지 나눠보는 거임

- 하지만, n-1까지 나눠볼 필요없이 조금 적게하는 방법은 n의 제곱근까지만 나눠보면 됨. 

- 파이썬에서 제곱근은 math.isqrt() 함수가 존재함. (import math필수)

import math
div_range = math.isqrt(int_i) +1

 

 

 

 

첫 시도 (1번 테스트만 시간 초과)

def solution(n, k):    
    store_binary = ""
    answer = 0
    
    while True:
        a = n%k
        store_binary = str(a) + store_binary
        
        n //= k
        
        if n < 1:
            break
    
    primer_check = list(store_binary.split('0'))
    
    for i in primer_check:
        if i == '':
            pass
        elif i == '1':
            pass
        else:
            Is_primer = 0
            int_i = int(i)
            for j in range(2, int_i//2):
                if int_i%j == 0:
                    Is_primer = 1
                    break
                    
            if Is_primer == 0:
                answer += 1
    return answer

 

정답 : isqrt() 함수 적용

# 진수 바꾸는 방법 알기
# 소수 판별 법 (최적화된 방법)

import math

def solution(n, k):    
    store_binary = ""
    answer = 0
    
    while True:
        a = n%k
        store_binary = str(a) + store_binary
        
        n //= k
        
        if n < 1:
            break
    
    primer_check = list(store_binary.split('0'))
    
    for i in primer_check:
        if i == '':
            pass
        elif i == '1':
            pass
        else:
            Is_primer = 0
            int_i = int(i)
            div_range = math.isqrt(int_i) +1
            for j in range(2, div_range):
                
                if int_i%j == 0:
                    Is_primer = 1
                    break
                    
            if Is_primer == 0:
                answer += 1
    return answer

 

테스트 1 통과 (135.03ms, 10.2MB)

 

근데 이래도 테스트 1은 135.03ms 나옴;;;