양의 정수 n
이 주어집니다. 이 숫자를 k진수로 바꿨을 때, 변환된 수 안에 아래 조건에 맞는 소수(Prime number)가 몇 개인지 알아보려 합니다.
0P0
처럼 소수 양쪽에 0이 있는 경우P0
처럼 소수 오른쪽에만 0이 있고 왼쪽에는 아무것도 없는 경우0P
처럼 소수 왼쪽에만 0이 있고 오른쪽에는 아무것도 없는 경우P
처럼 소수 양쪽에 아무것도 없는 경우정수 n과 k가 매개변수로 주어집니다. n을 k진수로 바꿨을 때, 변환된 수 안에서 찾을 수 있는 위 조건에 맞는 소수의 개수를 return 하도록 solution 함수를 완성해 주세요.
n
을 k
으로 바꿉니다. Integer.toString(n, k);
ex) n = 437674, k=3
numStr = "211020101011"
이 저장됩니다.numStr
를 0으로 split하여 P
를 찾아야한다고 생각했습니다.String[] split = ["211", "2", "1", "1", "11"]
를 얻을 수 있습니다.split[i]
번째 숫자를 long
형태로 변환 후 isPrime(num)
함수로 소수가 맞는지 확인합니다. 만약 소수가 맞다면 answer++
로 개수를 셉니다. isPrime
을 확인하여 조건을 만족하는 소수임으로 isPrime 함수를 호출하지 않고 answer++;
를 해줍니다.import java.util.Arrays;
import java.util.HashSet;
class Solution {
public int solution(int n, int k) {
int answer = 0;
String strNum = Integer.toString(n, k);
String[] split = strNum.split("0");
HashSet<Long> set = new HashSet<>();
for (int i = 0; i < split.length; i++) {
if (split[i].equals("")) continue;
long num = Long.parseLong(split[i]);
if (set.contains(num)) {
answer++;
} else {
if (isPrime(num)) {
answer++;
set.add(num);
}
}
}
return answer;
}
private boolean isPrime(long num) {
if (num == 1L)
return false;
for (long i = 2L; i <= Math.sqrt(num); i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
}