String kStr
에 넣는다.String[] numbers
에 담는다.numbers
의 요소를 하나씩 검사하며 소수인지 판별한다. 소수일 시 정답에 카운트한다.isPrime(int x)
: x가 소수인지 판별하는 메서드class Solution {
public int solution(int n, int k) {
String kStr="";
int remained=0;
while(n>0) {
remained = n%k;
kStr = remained+kStr;
n/=k;
}
String[] numbers = kStr.split("0");
int answer = 0;
for(int i=0;i<numbers.length;i++) {
if(numbers[i].equals("1") || numbers[i].equals("")) continue;
if(isPrime(Integer.parseInt(numbers[i]))) answer++;
}
return answer;
}
boolean isPrime(int x) {
for(int i=2;i*i<=x;i++) {
if(x%i==0) return false;
}
return true;
}
}
class Solution {
public int solution(int n, int k) {
String kStr="";
int remained=0;
while(n>0) {
remained = n%k;
kStr = remained+kStr;
n/=k;
}
String[] numbers = kStr.split("0+");
int answer = 0;
for(int i=0;i<numbers.length;i++) {
if(numbers[i].equals("1")) continue;
if(isPrime(Long.parseLong(numbers[i]))) answer++;
}
return answer;
}
boolean isPrime(long x) {
for(int i=2;i*i<=x;i++) {
if(x%i==0) return false;
}
return true;
}
}
바뀐 점은
제발 범위를 항상 생각하자 !!!!!
헌데 이렇게 바꾸어도 계속해서 테스트케이스 1번이 시간초과가 났다.
뭐가 문젤까 생각하다가 통과한 다른 사람들의 코드를 보아도 내 코드와 별반 다를 게 없었다.
다른 점은 소수 판별 시 제곱근까지 확인할 때, 나는 i*i<=x
로 계산했지만 다른 사람들은 Math.sqrt()
를 사용한 정도..?
혹시나 해서 내 코드도 Math.sqrt를 사용하도록 바꿨더니, 바로 테스트케이스 1번에도 통과했다.
-> 찾아봐도 정확한 이유는 모르겠다. 다만 직접 i*i를 곱하는 연산이 sqrt 메서드에서 행하는 연산보다 시간이 오래걸리나보다 .. 싶다.
boolean isPrime(long x) {
for(int i=2;i<=(int)Math.sqrt(x);i++) {
if(x%i==0) return false;
}
return true;
}