https://school.programmers.co.kr/learn/courses/30/lessons/92335
n, k가 주어질때 n을 k진수로 변환후 조건에 맞는 소수를 구하는 문제다.
입력
- 1 ≤ n ≤ 1,000,000
- 3 ≤ k ≤ 10
출력
조건에 맞는 소수의 개수
function isPrime(str) {
const num = +str;
if (num === 1) return false;
for (let i = 2; i * i <= num; i++) {
if (num % i === 0) return false;
}
return true;
}
function solution(n, k) {
const converted = n.toString(k);
let result = 0;
let tmpStr = '';
// console.log(converted);
for (let i = 0; i < converted.length; i++) {
const now = converted[i];
// 현재가 0이 아닌경우 일단 더함
if (now !== '0') {
tmpStr += now;
} else {
if (
tmpStr &&
isPrime(tmpStr) &&
(i - tmpStr.length === 0 || converted[i - tmpStr.length - 1] === '0')
) {
result++;
}
// 0일경우 계산후 tmpStr 비움
tmpStr = '';
}
// 마지막위치 인경우
if (
i === converted.length - 1 && // 마지막에 도달
now !== '0' && // 마지막이 0이 아닌경우
isPrime(tmpStr) // 소수일경우
) {
if (
converted[i - tmpStr.length] === '0' || // 문자열 왼쪽이 0일경우)
converted[i - tmpStr.length] !== '0' // 문자열이 하나고 P인경우
) {
result++;
}
}
}
return result;
}
문제를 정말 있는 그대로 풀었다.
그래서 그런지 코드가 나중에 내가 봐도 보기 힘들것같다.
일단 for문을 돌며 현재위치의 숫자가 0이 아닐때만 tmpStr에 추가해주고 0이라면
소수면서 조건에 맞다면 result를 1늘린다. 그 후에 다음 탐색을 위해 tmpStr에 빈값을 넣어준다.
만약 마지막 위치까지 도달했으면서,
현재 수가 소수면서 왼쪽이 0일경우 혹은 문자열에 0이 포함되지 않은경우
result를 1 늘린다.
그런데 다른사람이 풀이한 코드를 보니 더 쉬운방법으로 풀수가 있었는데
어려운 방법으로 풀게 됐다. 더 쉬운방법은 아래의 코드다.
function isPrime(num) {
if (!num || num === 1) return false;
for (let i = 2; i <= Math.sqrt(num); i++) {
if (num % i === 0) return false;
}
return true;
}
function solution(n, k) {
return n
.toString(k)
.split('0')
.filter(v => isPrime(+v)).length;
}
다른사람의 코드를 보니 문제를 일반화 시켜서 풀었다.
복잡했던 코드가 저어어어ㅓ어엉어어ㅓ어엉말 단순해진걸 볼수있다.
결국 문제가 원하는 답은 0이 포함되지 않은 숫자중 소수의 개수를 얻는거다.
그래서 k진수로 변환 -> 0 기준으로 자름 -> 소수 판별 -> 개수 출력
과정으로 단순화 시켜서 풀수가 있었다.
나도 문제를 푸는데 집중하지 않고 문제가 어떤 문제인지 더 집중하는 연습을 해야할것같다.
끗