알고리즘

[프로그래머스 Lv2 - 2022 KAKAO BLIND RECRUITMENT] k진수에서 소수 개수 구하기 (Python)

lwkejpf 2022. 9. 16. 07:29

 


 

def CheckPrime(n):
    if '0' in n or n == '1' :
        return False
    n = int(n)
    for i in range(2, n):
        if n % i == 0 :
            return False
    return True

def solution(n, k):
    answer = 0
    num = ''
    
    while (True) :
        num += str(n % k)
        n //= k
        if n == 0 : 
            break
            
    num = num[::-1]
    if CheckPrime(num) :    # num 자체가 소수일 때 (조건 4)
        return num
    else :    # 조건 1 ~ 조건 3
        start = 0
        for i in range(len(num)) :
            if num[i] == '0' : 
                if i != start and CheckPrime(num[start:i]) :
                    answer += 1
                start = i+1
    
    if CheckPrime(num[start:]) :
        answer += 1
        
    return answer

 

ㅎㅎ..

 

 

테스트케이스 여러 개 추가하면서 해보다가

 

 

 

105, 3 넣어봤는데 사진처럼 오류 뜸 ,, 

 

105를 3진수로 변환하면 10220 이라서 0이 맨 마지막에 오는데

마지막 for문에서 start 는 i+1 된 채로 끝나니까

5 가 된 채로 CheckPrime(num[start:]) 이 호출됨.

 

그래서 오류난 듯 존재하지 않는 인덱스라서 .. ㅎㅎㅎ.ㅎ.ㅎ.ㅎ..ㅎㅎ..

 

 

 

   if start < len(num) and CheckPrime(num[start:]) :
        answer += 1

 

if 조건에 start < len(num) 추가해줬더니

런타임 에러 뜨던 12번은 통과됨 ,, 그렇담 나머지는?

 

 

 

    if CheckPrime(num) :  
        return answer + 1

 

이거 조건 4번 (P처럼 소수 양쪽에 아무것도 없는 경우) 때문에 써놓은 건데

뭔 생각으로 return num 이라고 적어놨던건지 모르겠음 .....

 

암튼 2번도 통과됐으니까 이제 시간 초과만 해결하면 돼 ,, ㅇ읗ㄹ

 

 


 

 

    for i in range(2, math.ceil(math.sqrt(n))):
        if n % i == 0 :
            return False

 

헐 대박,,,, 하면서 range 범위 바꿨는데

이번엔 시간초과 해결되고 다른 테케가 오류남 뭐야요 대체?

 

라고 말하고 math.floor(math.sqrt(n)) + 1 로 바꿔주니까 해결됨 ㅎ. ㅎ

 

 

예를 들어 n = 9일 때 math.sqrt(9) 는 3으로 딱 나눠떨어져서

ceil() 이든 floor() 든 상관없이 3 이 나오게 됨.

 

근데 그렇게 되면 i 가 2까지만 돌게 되니까 나눠떨어지는 게 없어서 소수로 인식하는 듯

그래서 그냥 ceil() 대신 floor() 로 내림해주고 +1 해주니까 통과된 것 가틈

 

 


 

import math
def CheckPrime(n):
    n = int(n)
    if '0' in str(n) or n == 1 :
        return False
    for i in range(2, math.floor(math.sqrt(n))+1):
        if n % i == 0 :
            return False
    return True

def solution(n, k):
    answer = 0
    num = ''
    while (True) :
        num += str(n % k)
        n //= k
        if n == 0 : 
            break
            
    num = num[::-1]
    if CheckPrime(num) :  
        return answer + 1
    else :          
        start = 0
        for i in range(len(num)) :
            if num[i] == '0' : 
                if i != start and CheckPrime(num[start:i]) :
                    answer += 1
                start = i+1
    
    if start < len(num) and CheckPrime(num[start:]) :
        answer += 1
    return answer

 

드뎌 해결 ,,,