기본 틀 :
using System;
public class Solution {
public int solution(int n, int k) {
int answer = -1;
return answer;
}
}
문제를 보고 매개변수 n을 k진수로 변환하기 위해
Convert.ToString()을 사용할려고 했다.
하지만 Convert.ToString()은 2진수, 8진수, 10진수, 16진수 변환만 지원하기 때문에
문제의 3진수는 지원하지 않는다.
그래서, 직접 n을 k진수로 변환한 값을 구하기로 결정했다.
string temp = "";
while(n / k != 0)
{
temp += n % k;
n /= k;
}
temp += n;
방법은 간단한데 위의 코드처럼 n을 k로 나눈 나머지를 저장하고 나눠준다.
하지만, 이럴 경우
437674 => 3진수 변환
위와 같이 뒤집힌 3진수 문자열이 나오게 된다.
그래서,
temp = new string(temp.Reverse().ToArray());
위와 같이 문자열을 거꾸로 뒤집어줬다.
이제 3진수로 변환된 문자열을 보면 0을 기준으로
나누면
P*, *P*, *P 이 조건에 부합하는 숫자들을 구할 수 있게 된다.
이때, 1인 숫자가 문자열에 포함될 수 있는데 1은 소수가 아니므로 Where로 제거해준다.
string[] pNumber = temp.Split('0').Where(element=> element != "1").ToArray();
이렇게 구해진 문자열 배열을 정수형으로 변환해서 소수인지 구하면 된다.
for(int i = 0; i < pNumber.Length; i++)
{
int.TryParse(pNumber[i],out int result);
bool check = true;
if(result == 0) continue;
for(int j = 2; j <= (int)Math.Sqrt(result); j++)
{
if(result % j == 0) check = false;
}
if(check) count++;
}
문자열을 정수로 변환하는 방법으로는 int.TryParse을 사용했는데
그 이유로는, Split('0') 할 경우 "000"으로 존재할 경우
공백이 문자열 배열에 존재하게 되는 현상이 생겨서 int.TryParse로
int 형으로 형변환이 안 될 경우 0으로 형변환 시켜줬다.
그리고, 0이 나올 경우 continue로 아래 코드가 실행되지 않도록 해줬다.
그 결과,
테스트 1번 케이스에서 실패가 떳다. 코드에 오류가 있나해서 살펴 본 결과
크게 문제는 없어 보였다... 테스트를 통과하지 못 한 이유를 찾아보니
문자열 배열이 int형을 벗어나는 경우가 존재했다. 그래서,
using System;
using System.Linq;
public class Solution {
public int solution(int n, int k) {
int count = 0;
string temp = "";
while(n / k != 0)
{
temp += n % k;
n /= k;
}
temp += n;
temp = new string(temp.Reverse().ToArray());
string[] pNumber = temp.Split('0').Where(element=> element != "1").ToArray();
for(int i = 0; i < pNumber.Length; i++)
{
long.TryParse(pNumber[i],out long result);
bool check = true;
if(result == 0) continue;
for(long j = 2; j <= (long)Math.Sqrt(result); j++)
{
if(result % j == 0) check = false;
}
if(check) count++;
}
return count;
}
}
위와 같이 long 타입으로 변환한 결과
모두 통과할 수 있었다.