https://school.programmers.co.kr/learn/courses/30/lessons/92335#
헤맨 이유
본문 :
예를 들어, 437674을 3진수로 바꾸면 211020101011입니다. 여기서 찾을 수 있는 조건에 맞는 소수는 왼쪽부터 순서대로 211, 2, 11이 있으며, 총 3개입니다. (211, 2, 11을 k진법으로 보았을 때가 아닌, 10진법으로 보았을 때 소수여야 한다는 점에 주의합니다.)
=> 숫자를 10진수로 변환하라는 뜻으로 착각 (10진법으로 표시된 수로 여기라는 뜻이었다.)
놓친 것
소수에는 1이 포함되지 않음
class Solution {
public int solution(int n, int k) {
return getCnt(Integer.toString(n, k), k);
}
static int getCnt(String num, int k) {
int cnt = 0;
int N = num.length();
for(int i=0; i<N; i++) {
for(int j=i+1; j<=N; j++) {
String now = num.substring(i, j);
int size = j - i;
int r = i + size;
int l = i - 1;
long n = Long.valueOf(now);
// 각 자릿수에 0을 포함하지 않는 소수
if(hasZero(now) || !isPrime(n))
continue;
// 소수 양쪽에 0이 있는 경우
if(l >= 0 && r < N && num.charAt(l) == '0' && num.charAt(r) == '0')
cnt++;
// 소수 오른쪽에만 0이 있고 왼쪽에는 아무것도 없는 경우
else if(r < N && l == -1 && num.charAt(r) == '0')
cnt++;
// 소수 왼쪽에만 0이 있고 오른쪽에는 아무것도 없는 경우
else if(l >= 0 && r == N && num.charAt(l) == '0')
cnt++;
// 소수 양쪽에 아무것도 없는 경우
else if(l == -1 && r == N)
cnt++;
}
}
return cnt;
}
// 10진법 기준 소수 판별
static boolean isPrime(long n) {
if(n == 1)
return false;
long sqrt = (long) Math.sqrt(n);
for(long i=2; i<=sqrt; i++) {
if(n % i == 0)
return false;
}
return true;
}
// k진법 기준 0포함 체크
static boolean hasZero(String num) {
for(int i=0; i<num.length(); i++) {
if(num.charAt(i) == '0')
return true;
}
return false;
}
}
'[프로그래머스] 절대 외부 IDE를 써선 안돼 > Java' 카테고리의 다른 글
[lv2] 호텔 대실 (0) | 2024.12.12 |
---|---|
[lv2] 할인 행사 (0) | 2024.12.12 |
[lv2] 마법의 엘리베이터 (0) | 2024.12.10 |
[lv2] 혼자서 하는 틱택토 (0) | 2024.12.10 |
[lv2] 연속 부분 수열 합의 개수 (0) | 2024.12.08 |