본문 바로가기

Problem Solving/Programmers

[프로그래머스] Level 2 k진수에서 소수 개수 구하기 | 파이썬 (👀10진수 변환하기)

문제 설명

양의 정수 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

 

입출력 예

n k result
437674 3 3
110011 10 2

 

문제 풀이

import math
def convert(n, k):          
    q, r = divmod(n, k)
    if q == 0:
        return str(r)
    else:
        return convert(q, k) + str(r)
    
def solution(n, k):
    num = convert(n, k)

    num = [int(i) for i in num.split('0') if i and int(i) != 1]
    answer = []
    for i in num:
        for j in range(2, int(math.sqrt(i)+1)):
            if i % j == 0:
                break
        else:
            answer.append(i)
    return len(answer)

문제는 10진수인 n을 k진수로 바꾸는 과정과, 바뀐 수 안에 조건에 맞는 소수의 개수를 찾는 과정으로 구분된다. 코드를 나눠서 보자.

 

1) 10진수 n을 k진수로 변환 🐍

# 10진수 n을 k진수로 변환
def convert(n, k):          
    # temp = "0123456789ABCDEF"     
    # 10진수 이상의 변환이 필요한 경우 10~15의 숫자는 ABCDEF로 표현
    # 반환시 str(r)이 아닌 temp[r]로 반환
    q, r = divmod(n, k)
    if q == 0:
        return str(r)
    else:
        return convert(q, k) + str(r)

n을 k진수로 바꾸기 위해서는 몫이 0이 될 때까지 값을 k로 나누고, 나머지를 역으로 읽으면 된다. 

 

코드에서는 convert라는 이름의 함수를 만든 후에 재귀로 구현했다.

 

몫과 나머지를 구할 때에는 divmod() 함수를 사용했다.

 

문제는 제한사항에서 k를 10 이하로 두었기 때문에 나머지를 그대로 반환했지만, 10이 넘어가는 경우 알파벳을 반환해야 한다. 이 때는 주석 처리해둔 부분처럼 temp 문자열을 만든 후에 나머지를 인덱스처럼 사용하면 된다.

 

2) 조건에 맞는 소수의 개수 찾기🐍

def solution(n, k):
    # n을 k진수로 변환
    num = convert(n, k)
    
    # 빈 문자열과 1인 경우는 예외
    num = [int(i) for i in num.split('0') if i and int(i) != 1]
    answer = []
    for i in num:
        # 소수 판별
        for j in range(2, int(math.sqrt(i)+1)):
            if i % j == 0:
                break
        else:
            answer.append(i)
    return len(answer)

소수의 개수를 찾는 과정이다. 우선 입력값 n을 convert함수를 사용해 k진수로 변환한다.

 

그리고 '0'을 기준으로 나누는데 이때 값이 1인 경우는 제외한다(조건 참고).

 

소수는 해당 숫자(i)가 반복문 내에서 2에서 제곱근까지 나누었을 때 0으로 떨어지는 지로 확인했고, else문을 사용해서 나누어 떨어지지 않았을 때 answer 리스트에 추가하도록 했다.

 

마지막 결괏값은 소수의 개수를 출력해야 했기 때문에 len()을 사용했다.

 

 

 


참고자료 및 문제 출처

 

python 진법 변환

 

[Python] 진법 변환 총 정리?!

[Pyhton 진법 변환] n진수  → 10진수 python에서는 기본적으로 int() 라는 함수를 지원합니다. int(string, base) 위와 같은 형식으로 사용하면 됩니다. base에는 진법을 넣으면 됩니다. print(int('111',2)) pr..

security-nanglam.tistory.com

 

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

 
 

코딩테스트 연습 - k진수에서 소수 개수 구하기

문제 설명 양의 정수 n이 주어집니다. 이 숫자를 k진수로 바꿨을 때, 변환된 수 안에 아래 조건에 맞는 소수(Prime number)가 몇 개인지 알아보려 합니다. 0P0처럼 소수 양쪽에 0이 있는 경우 P0처럼 소

programmers.co.kr