비둘기 둥지

[프로그래머스 / 코딩테스트 ] 2022 카카오 공채 - k진수에서 소수 개수 구하기 본문

Python 공부/코딩 테스트 연습

[프로그래머스 / 코딩테스트 ] 2022 카카오 공채 - k진수에서 소수 개수 구하기

KimDove 2022. 10. 27. 00:28
728x90

1. 문제 설명

양의 정수 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 함수를 완성해 주세요.

2. 제한 사항

  • 1 ≤ n ≤ 1,000,000
  • 3 ≤ k ≤ 10

3. 입출력 예

n k result
437674 3 3
110011 10 2

4. 아이디어 얻어보기

  • 그동안 책을 너무 안 읽었는지 개인적으로는 문제를 읽어보고 한동안 무슨 소린지 이해를 못했었다..
  • 문제에서 요구하는 내용을 도식화 해보자면, 아래와 같다.

[사진 1] 문제에서 요구하는 알고리즘 도식

4-1. 지극히 개인적인 생각인 유심히 봐야할 부분

  • 이번 문제는 딱히 유심히 볼 부분은 없는거 같고 대신 수학적인 지식이 많이 들어갔다
    1.  정수 n을 k진수로 바꾸는 방법
      • 정수 n을 k진수로 바꾸는 방법은 정수 n을 2진법으로 바꾸는 법과 비슷하다. [사진 2]를 참고해보자.
    2.  정수 n의 소수 판정법
      • 정수 n이 소수인지 아닌지 판정하는 방법은 에라토스테네스의 체 라던지 굉장히 많지만,
        이 문제에서 적용해 볼 방법은 김둘기가 학부시절 정수론 시간 때 배웠던 내용이다..

4-2. 어떻게 구현해 볼까

  • 정수 n을 k진수로 바꿀때 몫과 나머지를 구하는 방법은 파이썬의 divmod 함수를 이용하였다.
  • %연산과 // 연산을 사용해도 되었지만, 그냥 한 줄로 그리고 함수 하나로만 사용하고 싶었다..
n, k = 99, 4

print(f'with divmod    : {divmod(99, 4)}')
print(f'without divmod : ({99 // 4}, {99 % 4})')

## 출력 결과
with divmod    : (24, 3)
without divmod : (24, 3)
  • 정수 n이 소수인지 판별하는 함수는 4-1에서 언급한대로 정수론에서 아이디어를 얻어왔다.
def is_prime(n):
    if n == 1: return False
    for idx in range(2, int(mt.sqrt(n)) + 1):
        if n % idx == 0: return False
    
    return True
    
print(f'is 1 prime? | {is_prime(1)}')
print(f'is 5  prime? | {is_prime(5)}')
print(f'is 30 prime? | {is_prime(30)}')

## 출력 결과
is 1 prime? | False
is 5  prime? | True
is 30 prime? | False
  • 최종적인 답을 내주는 함수는 위에서 정의한 get_log함수와 is_prime함수를 활용하였다.
def solution(n, k):
    cnt = 0
    
    for l in get_log(n, k).split('0'):
        if l == '': continue
        if is_prime(int(l)): cnt += 1
        
    return cnt
    
sol1 = solution(437674, 3)
sol2 = solution(110011, 10)

print(f'solution 1 : {sol1}')
print(f'solution 2 : {sol2}')

## 출력 결과
solution 1 : 3
solution 2 : 2

5. 문제를 풀어봅시다.

import math as mt

def get_log(n, k):    
    log = ''
    while n > 0:
        n, mod = divmod(n, k)
        log += str(mod)
        
    return log[::-1]

def is_prime(n):
    if n == 1: return False
    for idx in range(2, int(mt.sqrt(n)) + 1):
        if n % idx == 0: return False
    
    return True

def solution(n, k):
    cnt = 0
    
    for l in get_log(n, k).split('0'):
        if l == '': continue
        if is_prime(int(l)): cnt += 1
        
    return cnt

99. 자료 출처

99-1. 문제 출처

  • 프로그래머스 - 2022 KAKAO BLIND RECRUITMENT k진수에서 소수 개수 구하기 | [문제 출처]

전체코드

 

GitHub - EvoDmiK/TIL: Today I Learn

Today I Learn. Contribute to EvoDmiK/TIL development by creating an account on GitHub.

github.com

  • 제 깃허브에서 한글이 깨지는 문제가 발생하는데 최대한 빨리 처리하도록 하겠습니다. 죄송합니다ㅠㅠ

내용 추가 이력


부탁 말씀

개인적으로 공부하는 과정에서 오류가 있을 수 있으니, 오류가 있는 부분은 댓글로 정정 부탁드립니다.

728x90
Comments