Algorithm

2진수, 3진수, k진수 변환하는 법 | 파이썬 k진수 변환 | 소수찾기 | 프로그래머스 k진수에서 소수찾기 파이썬

재온 2024. 2. 15. 21:08

k진수 찾기랑 소수 찾기는 코테에서 꽤나 빈출 유형으로 나오는데 두 가지가 결합된 문제가 있어 정리해본다.  기억해두고 더 이상 헷갈리지 말자. 

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

k진수 

 k진법이란 0부터 k개의 숫자를 사용해서 수를 표현하는 방법으로, 2진법은 0과 1의 2가지 숫자로 수를 표현한다. 3진법은 0,1,2의 3가지 숫자로 수를 표현한다.  즉, 0부터 k-1까지의 숫자로 수를 표현하는 것을 말한다. 

구하는 방법은 그림과 같다. k진수로 수를 나타내고 싶을 때, k로 몫이 k보다 작아질때까지 나눠준다. 그 후, 몫과 지금까지 나눈 나머지를 쭉 써주면 된다. 

파이썬으로는 다음과 같이 구현할 수 있다. 나머지를 쭉 더해주고 몫을 새로운 n으로 업데이트해준다. 

number =''
while n :
    b = n% k #나머지  
    number = str(b)+number #join으로 하면 나중에 뒤집어줘야함
    n = n // k  #몫

 

소수 찾기 

소수는 1과 자기 자신만을 약수로 가지는 수이다. 즉, 1과 자기자신 외에는 절대 나누어 떨어지지 않는 수를 의미한다. 

만약 n을 1~n 사이의 어떤 숫자로 나누었을 때 0으로 나누어 떨어지는 숫자가 있다면 소수가 아니게 되는 것이다.  

하지만 2부터 n-1까지의 숫자로 나누어 떨어지는지 전부 확인할 경우 굉장히 많은 시간이 소요된다. 

10정도야 2부터 9까지 모두 나눠봐도 탐색하는데에 많은 시간이 소요되지 않지만 238597129576106같은 큰 숫자는 모두 탐색하기가 어렵다. 

n의 모든 약수는 n/2보다 작다는 성질을 가진다. 따라서 굳이 n-1까지 전부 탐색하지 않고 2/n까지만 탐색해도 된다. 하지만 이 방법보다 더 크게 시간 복잡도를 줄일 수 있는 방법이 있다. 

바로 제곱근보다 작은 수들 중에 약수가 없다면, 제곱근보다 큰 수들은 n의 약수가 아니다라는 성질을 이용하는 것이다. 

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

 

이렇게 하면 해당 숫자가 소수인지 아닌지 판별할 수 있다.

 

k진수에서 소수찾기 

이를 활용하여 문제를 풀 수 있다.

#n을 k진수로 변환하였을 떄, 변환된 수 안에 조건에 맞는 소수가 몇개 있는지 return 
def solution(n, k):
    ##우선 k진수로 변환 
    number =""
    while n :
        number = str(n% k)+number #join으로 하면 나중에 뒤집어줘야함
        n = n // k  #몫
    number=number.split("0")  #0기준으로 나누기 
    print(number)
    ##조건에 맞는 소수 찾기: 중복되는 소수도 따로 count
    cnt = 0 
    for i in number:
        if len(i)==0:  
            continue
        if int(i)<2:
            continue
        prime=True
        for j in range(2, int(int(i)**0.5 + 1)):
            if int(i) % j ==0:
                prime=False
                break
        if prime:
            cnt+=1
    return cnt
300x250