반응형
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/92335
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제
풀이 및 코드
저는 이 문제를 조금 다른 방법으로 접근하였습니다.
문제에서의 0p혹은 p0 혹은 0p0 혹은 p라는 숫자들을 보고 통일성 있게 설정을 해줄 수 있지 않을까? 라는 생각을 먼저하였습니다.
그래서 처음 숫자를 k진법으로 변환을 한 후에 vector v에 담아 줬습니다.
v에서 맨앞과 맨 뒤에 0을 넣게 된다면
통일성 있게 무조건 0p0이 될수 밖에 없다는 것을 착안해서 문제를 풀었습니다
0p -> 00p0
p0 -> 0p00
0p0 -> 00p00
p -> 0p0 생각해보자면 결국 무조건 0에 둘러싸인 p가 될수 밖에 없다고 생각하였습니다.
그렇게 한후 0이 아닌 숫자들에 대해서 소수인지 아닌지를 판별한 후 계산을 진행해주었습니다.
또한 long long으로 하였을때 테스트1 에 대해서 틀렸길래 범위를 초과한 숫자가 들어왔나? 하고 unsigned long long으로 설정을 해주었더니 통과하였습니다.
#include <string>
#include <vector>
#include <iostream>
using namespace std;
bool isPrime(unsigned long long n)
{
if (n <= 3)
return n > 1;
if (n % 2 == 0 || n % 3 == 0)
return false;
for (long long i = 5; i * i <= n; i++)
if(n % i == 0)
return false;
return true;
}
int solution(int n, int k) {
int answer = 0;
int location = 1;
unsigned long long num = 0;
vector<int> v;
//이런식이면 15면 210이 되야함
while(n > 0){
v.insert(v.begin(),n % k);
n /= k;
}
//초반과 끝에 0을 넣어줌으로써 무조건 양옆에 0일경우에만 진행을 하는것으로 진행
//굳이 split할 필요없이 0이 들어오면 무시하는 방향으로 그리고 양옆에 0이 꼭 있게 되는 상황으로 만들어줌
v.insert(v.begin(),0);
v.push_back(0);
for(int i = 0; i < v.size();i++){
if(v[i] == 0){
if(isPrime(num))
answer++;
num = 0;
}
else{
num *= 10;
num += v[i];
}
}
return answer;
}
반응형
'알고리즘 > c++ 프로그래머스' 카테고리의 다른 글
[프로그래머스 n진수 게임] c++ (풀이법, 코드) (0) | 2023.05.19 |
---|---|
[프로그머스 압축] c++ (풀이 및 코드) (0) | 2023.05.19 |
[프로그래머스 전화번호 목록] c++ (코드, 풀이, 개념) (0) | 2023.05.17 |
[프로그래머스 타겟넘버] c++ (코드, 풀이, 개념) (0) | 2023.05.17 |
[프로그래머스 피로도] c++ (문제풀이, 개념, 코드) (0) | 2023.05.17 |
댓글