[프로그래머스] k진수에서 소수 개수 구하기

1 minute read

문제 설명

https://programmers.co.kr/learn/courses/30/lessons/92335

제한사항

  • 1 ≤ n ≤ 1,000,000
  • 3 ≤ k ≤ 10

풀이

30분
주어진 숫자를 k진수로 변환하고, 문자열을 ‘0’을 delimiter로 나눈 후, 그 문자열이 10진수로 소수인지 판별하는 문제였다.
제출후 1번 케이스에서

signal: aborted (core dumped)

에러가 발생해서 원인을 찾는데 대부분의 시간을 사용했다.
문제의 제약조건을 통해 숫자가 가장 큰 경우를 생각해보면 1000000에 가까운 숫자를 3진법으로 나타냈을 때, 0이 나타나지 않은 경우 가장 큰 숫자가 나올 수 있다. 3^12 이 50만에 가까우므로, 12자리 숫자를 생각해보면 int 형의 표현범위(약 21억)를 넘게되어 에러가 발생했던 것이다.
그래서 string을 int가 아닌 long long으로 변환하여 판별하는 방식으로 바꾸어 해결하였다.

코드

// 03:24 ~ 03:52
#include <string>
#include <vector>
#include <cmath>

using namespace std;

string kdigit_transfer(int n, int k){
    string s = "";
    while(n > 0){
        s = to_string(n % k) + s;
        n /= k;
    }
    return s;
}

bool isprime(long long n){
    if(n < 2) return false;
    for(int i =2; i <= sqrt(n); ++i){
        if(n % i == 0) return false;
    }
    return true;
}

int solution(int n, int k) {
    int answer = 0;
    string s = kdigit_transfer(n,k);
    vector<string> v;
    for(int i =0; i < s.size(); ++i){
        if(s[i] != '0'){
            int j = 1;
            while(i + j < s.size() && s[i + j] != '0') ++j;
            v.push_back(s.substr(i,j));
            i += j - 1;
        }
    }
    for(string item : v){
        if(isprime(stol(item))) answer += 1;
    }
    return answer;
}