Algorithm/프로그래머스
[프로그래머스] Lv 2. k진수에서 소수 개수 구하기(Python/Kotlin)
RIEN😚
2022. 6. 4. 13:06
728x90
반응형
코딩테스트 연습 - k진수에서 소수 개수 구하기
문제 설명 양의 정수 n이 주어집니다. 이 숫자를 k진수로 바꿨을 때, 변환된 수 안에 아래 조건에 맞는 소수(Prime number)가 몇 개인지 알아보려 합니다. 0P0처럼 소수 양쪽에 0이 있는 경우 P0처럼 소
programmers.co.kr
문제
양의 정수 n이 주어집니다. 이 숫자를 k 진수로 바꾸었을 떄, 변환된 수 안에 아래 조건에 맞는 소수가 몇 개인지 알아보려 합니다.
- 0P0처럼 소수 양쪽에 0이 있는 경우
- P0처럼 소수 오른쪽에만 0이 있고 왼쪽에는 아무것도 없는 경우
- 0P처럼 소수 왼쪽에만 0이 있고 오른쪽에는 아무것도 없는 경우
- P처럼 소수 양쪽에 아무것도 없는 경우
- 단, P는 각 자릿수에 0을 포함하지 않는 소수입니다.
정수 n과 k가 매개변수로 주어집니다. n을 k진수로 바꿨을 때, 변환된 수 안에서 찾을 수 있는 위 조건에 맞는
소수의 개수를 return하도록 solution 함수를 완성해 주세요.
풀이
먼저 이 문제에서 반드시 필요한 해당 숫자가 소수인지 판단한는 함수를 작성해보겠습니다.
def checkPrime(num):
if num < 2: return False
for i in range(2, int(math.sqrt(num))+1):
if num i % i == 0:
return False
return True
그럼 이번에는 조건을 만족하는 수를 구해보도록 하겠습니다.😆
문제에서 보면 알 수 있듯이 0을 기준으로 숫자가 결정되는 것을 알 수 있습니다.
따라서 k진수의 수로 바꿀 때 나머지가 0이 되는 시점을 기준으로 이전에 나온 수가
조건을 만족하는 숫자 입니다. 이를 코드로 바꾸면 아래와 같습니다.
num, pos = 0 # 조건을 만족하는 수, 10단위 수
while n > 0:
mod = n % k
if mod == 0:
# 이전까지의 수가 조건을 만족하는 수 = num
# 소수인지 검사하는 로직 필요
num, pos = 0, 0
else:
num += mod * math.pow(10, pos)
pos += 1
n //= k
코드
Python 풀이
import math
def solution(n, k):
num, pos, answer = 0, 0, 0
while n > 0:
mod = n % k
if mod == 0:
if checkPrime(num):
answer += 1
num, pos = 0, 0
else:
num += mod * math.pow(10, pos)
pos += 1
n //= k
if num != 0 and checkPrime(num):
answer += 1
return answer
def checkPrime(num):
if num < 2: return False
for i in range(2, int(math.sqrt(num)) + 1):
if num % i == 0:
return False
return True
Kotlin
🌹 자료형에 주의해야 합니다.😭
import kotlin.math.*
class Solution {
fun solution(n: Int, k: Int): Int {
var num = n.toLong()
var no = 0L
var pos = 0
var answer = 0
while (num > 0L) {
val mod = num % k
if (mod == 0L) {
if (checkPrime(no)) {
answer += 1
}
no = 0
pos = 0
} else {
no += (mod * (10.0).pow(pos).toLong())
pos += 1
}
num = (num/k).toLong()
}
if (checkPrime(no)) {
answer += 1
}
return answer
}
fun checkPrime(num: Long): Boolean {
if (num < 2) return false
for (i in 2..sqrt(num.toDouble()).toInt()) {
if (num % i == 0L) {
return false
}
}
return true
}
}
반응형