(프로그래머) lv.2 k base의 소수 자릿수 계산

문제 설명

양의 정수 n이 주어진다.이 번호 k진법으로 변환할 때 변환된 숫자 중 다음 조건을 만족하는 소수가 몇 개인지 알고 싶습니다.

  • 0P0과 같이 소수점 양쪽에 0이 있는 경우
  • 소수의 우변에 0만 있고 좌변에는 없는 경우(예: P0)
  • 0P와 같이 소수점 왼쪽에 0이 하나만 있고 오른쪽에는 하나도 없는 경우.
  • P와 같이 소수의 어느 쪽도 아닌 경우
  • 단계, P는 각 자리에 0이 없는 십진수입니다.
    • 예를 들어 101은 P가 될 수 없습니다.

예를 들어 437674를 삼항으로 변환하려면 211020101011입니다. 여기서 찾을 수 있는 소수는 211, 2, 11로 왼쪽부터 총 3개입니다. (211, 2, 11 참조 211은 k진법이 아닌 10진수로 볼 때 소수여야 합니다. ) P0 표에서 찾을 수 있습니다. 2는 0P0에서 11은 0P에서 찾을 수 있습니다.

자연 그리고 k는 인수로 제공됩니다. 아니요 k진법으로 환산했을 때 환산된 수에서 찾은 수 위의 조건을 만족하는 소수solve 함수에서 반환된 숫자를 완성하십시오.


한계

  • 1≤ 아니요 ≤ 1,000,000
  • 3≤ 케이 ≤ 10

입력 및 출력 예

아니요 케이 결과
437674
110011 10 2


기본적인 변환이 어려운 경우가 많아 관심도 가지지 않는 문제지만, 그래도 할 줄 알아야 하니까 해봐야겠다는 마음가짐으로 시작합니다.

꼬박 이틀 동안 친구와 함께 해결했습니다. 하루종일 투자한건 아니고 여유시간을 합쳐 문제를 생각해보면 5시간은 걸린것 같아요.

친구가 기본적인 전환에 많은 도움을 주었습니다. 혼자 공부를 더 해야겠습니다.

처음에는 하나의 함수만 만들어서 사용하려고 했으나 자꾸 답이 이상하게 나와서 결국 다른 함수를 만들어서 사용하게 되었습니다.

def prime_num_find(pn):
#쪼갠걸 정수로 변경해서 2부터 int(sol2(i))이거전까지 나눠서 나눠지는게 없으면 +1           
    
    #print(i)
    if pn == 1:   # "" 와 1 건너뛰기
        return False      # 위의 조건 만족하면 이후 코드 진행
    for j in range(2, int(pn**(0.5)) + 1):  
        if pn % j == 0:   # i가 나누어지면 소수가 아닌것
            return False
    return True
         # 위의 문을 모두 충족시키지 않는 수(소수)는 count 함

이것이 “소수 결정” 기능입니다.

내 솔루션

def solution(n, k):
    answer = -1
    rev_base=""
    count = 0
    # k진수로 변경
    while n > 0:
        n, mod = divmod(n, k)
        rev_base += str(mod)
        sol = rev_base(::-1)
    # 역순인 진수를 뒤집어 줘야 원래 변환 하고자하는 base가 출력

    # 0으로 쪼개기
    sol2 = sol.split('0')
    sol2 = list(filter(lambda x: x != '', sol2))
    sol2 = list(map(int, sol2))
    #print(sol2)
    
    for a in sol2:
        if prime_num_find(a):
            count += 1
    return count

def prime_num_find(pn):
#쪼갠걸 정수로 변경해서 2부터 int(sol2(i))이거전까지 나눠서 나눠지는게 없으면 +1           
    
    #print(i)
    if pn == 1:   # "" 와 1 건너뛰기
        return False      # 위의 조건 만족하면 이후 코드 진행
    for j in range(2, int(pn**(0.5)) + 1):  
        if pn % j == 0:   # i가 나누어지면 소수가 아닌것
            return False
    return True
         # 위의 문을 모두 충족시키지 않는 수(소수)는 count 함
    # if True:
    #     count += 1

드디어 이 코드가 나왔습니다.

초기의

 sol2 = list(filter(lambda x: x != '', sol2))

for 문으로 이 코드를 처리하려고 했지만 결과는 항상 이상합니다. 그래서 파이썬 내장 함수를 검색해서 사용했습니다.

이 정도는 친구랑 풀었는데…혼자 했다면 풀지 못했을 것 같고, 더 오래 걸렸을 것 같아요.

항상 질문을 할 때마다 이런 생각이 들지만 정말 현실적으로 배워야 합니다.