문제
https://school.programmers.co.kr/learn/courses/30/lessons/92335
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
양의 정수 `n`을 `k`진수의 숫자로 변환했을 때, 그 수 안에 있는 소수의 개수를 구하려고 한다.
아래 조건에 맞는 경우에만 소수로 판단한다.
- `0P0`처럼 소수 양쪽에 0이 있는 경우
- `P0`처럼 소수 오른쪽에만 0이 있고 왼쪽에는 아무것도 없는 경우
- `0P`처럼 소수 왼쪽에만 0이 있고 오른쪽에는 아무것도 없는 경우
- `P`처럼 소수 양쪽에 아무것도 없는 경우
- 단, `P`는 각 자릿수에 0을 포함하지 않는 소수입니다.
- 예를 들어, 101은 `P`가 될 수 없습니다.
`n`과 `k`의 범위는 다음과 같다.
- 1 ≤ `n` ≤ 1,000,000
- 3 ≤ `k` ≤ 10
풀이
처음 봤을 땐 조건이 많아서 고민을 했었는데, 문자열을 투 포인터로 돌면서 소수를 판별해주고자 했다.
그래서 투 포인터를 사용해서 코드를 구현하고자 했으나, 구현할 방법이 떠오르지 않아 구현 방법을 검색해서 풀었다.
조건을 차근차근 해석해 보면, 0을 단위로 끊어서 소수를 판별해야 한다는 것을 알 수 있다. 심지어 자릿수의 맨 앞, 맨 뒤가 아닌 중간에 0이 포함된 소수는 소수로 판별하지 않는다. 그래서 투 포인터로 굳이 구하지 않아도 0을 단위로 끊어서 소수를 판별해주기만해도 쉽게 구해줄 수 있다.
코드
투 포인터를 사용한 방식이다.
import java.util.*;
class Solution {
public int solution(int n, int k) {
String[] targets = getNBasedNumber(n, k).split("0");
int count = 0;
int start = 0;
for (int end = 0; end <= nBasedNum.length(); end++) {
// 구간 끝이거나 0을 만나면 토큰 완성
if (end == nBasedNum.length() || nBasedNum.charAt(end) == '0') {
if (start < end) {
String token = nBasedNum.substring(start, end);
if (!token.contains("0") && isPrime(Long.parseLong(token))) {
count++;
}
}
start = end + 1; // 다음 구간 시작
}
}
return count;
}
public String getNBasedNumber(int num, int base) {
StringBuilder sb = new StringBuilder();
while (num > 0) {
sb.append(num % base);
num /= base;
}
return sb.reverse().toString();
}
public boolean isPrime(long num) {
if (num < 2) return false;
for (long i = 2; i <= (long) Math.sqrt(num); i++) {
if (num % i == 0) return false;
}
return true;
}
}
0 단위로 Tokenizing해서 푼 코드다.
import java.util.*;
class Solution {
public int solution(int n, int k) {
String[] targets = getNBasedNumber(n, k).split("0");
int count = 0;
for (String num : targets) {
if (num.equals("")) continue;
if (isPrime(Long.parseLong(num))) {
count++;
}
}
return count;
}
public String getNBasedNumber(int num, int base) {
StringBuilder sb = new StringBuilder();
while (num > 0) {
sb.append(num % base);
num /= base;
}
return sb.reverse().toString();
}
public boolean isPrime(long num) {
if (num < 2) return false;
for (long i = 2; i <= (long) Math.sqrt(num); i++) {
if (num % i == 0) return false;
}
return true;
}
}'Problem Solving > 프로그래머스' 카테고리의 다른 글
| [프로그래머스/Java] 다트 게임 (2) | 2025.05.30 |
|---|---|
| [프로그래머스/Java] 압축 (0) | 2025.05.30 |
| [프로그래머스/Java] 실패율 (2) | 2025.05.28 |
| [프로그래머스/Java] N진수 게임 (feat. Java 진법 변환) (1) | 2025.05.23 |
| [프로그래머스/Java] 뉴스 클러스터링 (1) | 2025.05.22 |
