250x250
Recent Posts
Recent Comments
Archives
- Today
- Total
KimDove
안녕하세요, 딥러닝 엔지니어 김둘기 입니다.
비둘기 둥지
[프로그래머스 / 코딩테스트 ] 2022 카카오 공채 - k진수에서 소수 개수 구하기 본문
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. 아이디어 얻어보기
- 그동안 책을 너무 안 읽었는지 개인적으로는 문제를 읽어보고 한동안 무슨 소린지 이해를 못했었다..
- 문제에서 요구하는 내용을 도식화 해보자면, 아래와 같다.
4-1. 지극히 개인적인 생각인 유심히 봐야할 부분
- 이번 문제는 딱히 유심히 볼 부분은 없는거 같고 대신 수학적인 지식이 많이 들어갔다
- 정수 n을 k진수로 바꾸는 방법
- 정수 n을 k진수로 바꾸는 방법은 정수 n을 2진법으로 바꾸는 법과 비슷하다. [사진 2]를 참고해보자.
- 정수 n의 소수 판정법
- 정수 n이 소수인지 아닌지 판정하는 방법은 에라토스테네스의 체 라던지 굉장히 많지만,
이 문제에서 적용해 볼 방법은 김둘기가 학부시절 정수론 시간 때 배웠던 내용이다..
- 정수 n이 소수인지 아닌지 판정하는 방법은 에라토스테네스의 체 라던지 굉장히 많지만,
- 정수 n을 k진수로 바꾸는 방법
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진수에서 소수 개수 구하기 | [문제 출처]
전체코드
- 제 깃허브에서 한글이 깨지는 문제가 발생하는데 최대한 빨리 처리하도록 하겠습니다. 죄송합니다ㅠㅠ
내용 추가 이력
부탁 말씀
개인적으로 공부하는 과정에서 오류가 있을 수 있으니, 오류가 있는 부분은 댓글로 정정 부탁드립니다.
728x90
'Python 공부 > 코딩 테스트 연습' 카테고리의 다른 글
[프로그래머스 / 코딩테스트] 2022 카카오 인턴십 - 성격 유형 검사 하기 (3) | 2022.10.31 |
---|---|
[프로그래머스 / 코딩테스트 ] 2022 카카오 공채 - 주차요금 계산 (4) | 2022.10.23 |
[프로그래머스 / 코딩테스트 ] 2022 카카오 공채 - 신고 결과 받기 (0) | 2022.10.21 |
Comments