본문 바로가기
[프로그래머스]

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

by Hevton 2023. 9. 18.
반응형

 

 

이번문제..

 

기업코테는 왠만하면 int를 쓰지 말고 long을 써야겠다. 숫자 범위를 넘어가기 때문이다.

 

이번 문제에서 배운 핵심은 두가지다.

 

1. C++에서 split 함수 구현하기

C++에선 split함수를 직접 구현해야한다.

stringstream과 getline함수를 이용하는데, 이건 연습을 틈틈이 해줘야 좋을 것 같음.

 

2. stoi 대신에 stol 써보기

stoi는 integer이며, stol이 long이다.

 

 

신경써야할게 생각보다 참 많다.. n의 범위는 1,000,000 이어서 int로 뭔가 충당될 것만 같지만

k진수로 바꾸는 과정에서 엄청나게 길어진 문자열이 되기 때문에 int로는 충당이 안되고 long으로 바꿔줘야 한다.

#include <string>
#include <vector>
#include <sstream>
#include <iostream>
#include <algorithm>

using namespace std;

// k 진수로 바꾸고, 0을 split으로 해서 숫자를 만들면 됨.

bool isPrime(long number) {

    if(number < 2)
        return false;
    for(long i = 2; i * i <= number; i++) {
        if(number % i == 0)
            return false;
    }
    return true;
}


vector<string> split(string str, char delimeter) {
    
    vector<string> answer;
    stringstream ss(str);
    string temp;
    
    while(getline(ss, temp, delimeter))
        answer.push_back(temp);
    
    
    return answer;
}


string makeNumber(int n, int k) {
    
    string answer = "";
    
    while(n > k) {
        answer += to_string(n % k);
        n /= k;
    }
    
    answer += to_string(n);
    reverse(answer.begin(), answer.end());
    
    return answer;
}


int solution(int n, int k) {
    int answer = 0;
    
    vector<string> list = split(makeNumber(n, k), '0');
    
    for(auto x : list) {
        if(x.length() > 0 && isPrime(stol(x)))
            answer++;
    }
    
    return answer;
}
반응형