[프로그래머스/C++]Lv.2 - k진수에서 소수 개수 구하기

YH J·2023년 9월 27일
0

프로그래머스

목록 보기
158/168

문제 링크

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

내 풀이

n을 k진수로 바꾸는 함수 생성
num이 소수인지 판별하는 함수 생성
소수 판별은 나머지 연산으로 나머지가 있으면 바로 false를 리턴해도 되는데
2와 3을 예외처리 하지 않고 해보려고 저렇게 구현해봤다.
0을 다 공백으로 바꾼 뒤 stringstream으로 파싱하였다.
처음엔 int로 해서 자꾸 오류가 났다. long long을 사용하였다.

내 코드

#include <string>
#include <vector>
#include <sstream>
using namespace std;

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

bool Check(long long num)
{    
    if(num == 1)
        return false;
    
    int count = 0;
    
    for(long long i = 1; i * i <= num; i++)
    {
        if((num / i)*i == num)
            count++;
    }
    return count == 1 ? true : false;
}


int solution(int n, int k) {
    int answer = 0;
    
    string s = Change(n,k);
    for(int i = 0; i < s.length(); i++)
        if(s[i] == '0')
            s[i] = ' ';
    
    stringstream ss;
    ss.str(s);
    
    long long num;
    
    while(ss >> num)
        answer += Check(num);
    
    return answer;
}

다른 사람의 풀이

#include <bits/stdc++.h>
using namespace std;

bool is_prime(long long n) {
    if (n < 2) return false;
    for (long long i = 2; i * i <= n; ++i) if (n % i == 0) return false;
    return true;
}
int solution(int n, int k) {
    string str;
    while (n) {
        str += n % k + 48;
        n /= k;
    }

    reverse(str.begin(), str.end());
    str += 48;

    int ans = 0;
    for (long long hold = 0, i = 0; i < str.size(); ++i) {
        if (str[i] == '0') {
            if (is_prime(hold)) ++ans;
            hold = 0;
            continue;
        }
        hold = hold * 10 + str[i] - 48;
    }

    return ans;
}

다른 사람의 풀이 해석

n을 k진수로 변환하면서 바로 string으로 변환하였다.
stringstream을 사용하지 않고 string을 순회하면서 0을 만나면 소수를 판별한다.

profile
게임 개발자 지망생

0개의 댓글