프로그래머스: k진수에서 소수 개수 구하기[JS]

Song-Minhyung·2022년 10월 29일
0

Problem Solving

목록 보기
29/50
post-thumbnail

문제

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

n, k가 주어질때 n을 k진수로 변환후 조건에 맞는 소수를 구하는 문제다.

입력

  • 1 ≤ n ≤ 1,000,000
  • 3 ≤ k ≤ 10

출력
조건에 맞는 소수의 개수

정답코드1

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;
}

정답코드1 설명

문제를 정말 있는 그대로 풀었다.
그래서 그런지 코드가 나중에 내가 봐도 보기 힘들것같다.

일단 for문을 돌며 현재위치의 숫자가 0이 아닐때만 tmpStr에 추가해주고 0이라면
소수면서 조건에 맞다면 result를 1늘린다. 그 후에 다음 탐색을 위해 tmpStr에 빈값을 넣어준다.

만약 마지막 위치까지 도달했으면서,
현재 수가 소수면서 왼쪽이 0일경우 혹은 문자열에 0이 포함되지 않은경우
result를 1 늘린다.

그런데 다른사람이 풀이한 코드를 보니 더 쉬운방법으로 풀수가 있었는데
어려운 방법으로 풀게 됐다. 더 쉬운방법은 아래의 코드다.

정답코드2

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 기준으로 자름 -> 소수 판별 -> 개수 출력
과정으로 단순화 시켜서 풀수가 있었다.

나도 문제를 푸는데 집중하지 않고 문제가 어떤 문제인지 더 집중하는 연습을 해야할것같다.

profile
기록하는 블로그

0개의 댓글