본문 바로가기
기술/Problem Solving

[Programmers] k진수에서 소수 개수 구하기

by 팡팡구리 2022. 1. 17.
반응형

출처


 

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

 

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

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

programmers.co.kr

 

 

 

문제


 

 

제한사항


 

 

풀이 및 코드


문제 조건만 보면 1) 0P0일 때 2) P0일 때 3) 0P일 때 4) P는 각 자릿수에 0을 포함하지 않을 때로

뭔가 복잡해 보이는 것 같다. 그러나 자세히 보면 결국 이 조건들은 0을 가지고 숫자를 나누라는 얘기이다.

따라서, 이 문제에서 크게 해야할 일들은

 

  1. k진수로 n을 변환
  2. 0을 기준으로 변환한 값을 나누기
  3. 각 값의 소수 여부 판별

이렇게 3개로 나눌 수 있다.

 

그러므로 k진수 변환을 위해 유클리드 호제법을,

0을 기준으로 값을 나누기 위해 split() 함수를,

소수 판별을 위해 소수의 성질을 이용해서 다음과 같이 구현하였다.

 

k진수 변환 과정에서 추후 split() 함수를 쓰므로 굳이 형변환 하지 않고 String으로 반환하였고,

0을 기준으로 split()했을 때, 발생하는 공백을 제거하기 위해 리스트 컴프리헨션을 사용하였다.

소수 판별에서는 에라토스테네스의 체를 이용할까 했지만, 제한조건의 범위가 크지 않다고 판단하여 해당 수의 제곱근까지만 for문을 돌며 나누어 떨어지는 수가 있는지 없는지를 가지고 소수를 판별했다.

 

def convert(n, k):
    convertedN = ""
    while (n >= 1):
        convertedN = str(n%k) + convertedN
        n //= k
    return convertedN

def prime(m):
    for i in range(2, int(m**0.5)+1):
        if m%i == 0:
            return False
    return True

def solution(n, k):
    convertedN = convert(n, k)
    numList = convertedN.split("0")
    numList = [int(x) for x in numList if x != ""]
    
    answer = 0
    for num in numList:
        if num == 1: continue
        if prime(num):
            answer += 1
            
    return answer

'기술 > Problem Solving' 카테고리의 다른 글

[Programmers] 주차 요금 계산  (0) 2022.01.17
[Programmers] 신고 결과 받기  (0) 2022.01.16
[baekjoon] 4900번 7 더하기  (0) 2021.07.27
[baekjoon] 1263번 시간 관리  (0) 2021.07.23
[baekjoon] 1706번 크로스워드  (0) 2021.07.17