프로그래머스 - k진수에서 소수 개수 구하기!
2022. 9. 8. 17:24ㆍ코딩 공부 연습
반응형
이번에는 다다음주 쯤있을 카카오 블라인트를 신경을 좀 써보고자 한번 시간을 재면서 풀었다.
웬걸 이딴 문제를 푸는데 1시간이 걸렸다!ㅋㅋ
아 시간을 들일 문제가 절대 아닌데 스스로에게 조금 실망했다.
단계를 나누어서 풀어서 시간이 쥰나 오래걸렸음에도 할 수 있었다. 첫째로, k진수로 바꾸어서 저장한다. 이 때, 0이 있는 위치를 파악하기 위해 배열에 한자리 한자리씩 저장하면서, 0의 위치는 따로 배열에 담았다.
이 후 아까 저장한 0의 위치를 기준으로 숫자를 다 잘라서 또다른 배열에 저장하였다.
이제 이 배열을 순회하면서 이게 소수인지 아닌지를 판단해 주었다 끝!! 이상하게 0 기준으로 나누는데에서 시간을 드럽게 잡아먹었다. 멍청 그자체 ㅋㅋ
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int check_sosu(long long num)
{
if (num < 2) return 1;
int a = (int) sqrt(num);
for (int i = 2; i <= a; i++) if (num % i == 0) return 1;
return 0;
}
int solution(int n, int k) {
int answer = -1;
//일단 k진수로 바꾸기,
//에라토스테네스 해야하는데 그 범위를...100만을 2진수로 바꾸면 배열로하기에 너무 사이즈가 커짐.
//k진수로 바꾼다음에 처음으로 0이 등장할때까지의 수가 소수인지, 이후로 0 기준으로 계속 확인. -> 이건 어케 하노
//에라토스 안하고 그냥 0을 기준으로 다 나눠서 숫자들만 벡터에 담아놓고 걔들만 소수인지 찾던가. --> 이거로 일단 나누자
//1단계 : k진수로 바꾸기
long long k_n = 0;
vector <int> tmp;
vector <int> tmp2;
vector <int> z_idx;
while(n > 0)
{
tmp.push_back(n%k);
n/=k;
}
long long tmpsize= tmp.size();
z_idx.push_back(0);
for(int i = 0; i< tmpsize; i++)
{
if(tmp[tmpsize-i-1] == 0)
z_idx.push_back(i); //0이 위치한 위치를 기억함.
tmp2.push_back(tmp[tmpsize-i-1]);
}
for(int i = tmp.size()-1; i >= 0; i--)
k_n = k_n*10 + tmp[i];
//cout<<k_n<<'\n';
z_idx.push_back(tmpsize);
vector<long long> dividened;
//2단계 : 0을 기준으로 나뉘는 수 다 저장하기.
for(int i = 0; i< z_idx.size()-1; i++)
{
long long big = pow(10, tmp.size() - z_idx[i+1]);
long long small = pow(10, z_idx[i+1] - z_idx[i]);
long long ans1 = k_n / big;
long long ans2 = ans1 % small;
dividened.push_back(ans2);
}
// step3. 나눈애들이 소수인지 확인.
for(int i = 0; i< dividened.size(); i++)
{
if (check_sosu(dividened[i]) == 0)
answer++;
}
return answer+1;
}
'코딩 공부 연습' 카테고리의 다른 글
프로그래머스 - 영어 끝말잇기 (1) | 2022.09.13 |
---|---|
프로그래머스 - 주차 요금 계산 (1) | 2022.09.13 |
백준 바킹독 재귀 모음 - 1629 곱셈, (0) | 2022.09.07 |
소프티어 - H-클린알파 (0) | 2022.09.05 |
소프티어 - 성적평균 (0) | 2022.09.04 |