본문 바로가기

Coding Test/Programmers

[프로그래머스/JavaScript] 코딩 테스트 풀이 (문제 70 - 소인수분해 )

728x90
# 문제

소인수분해란 어떤 수를 소수들의 곱으로 표현하는 것입니다. 예를 들어 12를 소인수 분해하면 2 * 2 * 3 으로 나타낼 수 있습니다. 따라서 12의 소인수는 2와 3입니다. 자연수 n이 매개변수로 주어질 때 n의 소인수를 오름차순으로 담은 배열을 return하도록 solution 함수를 완성해주세요.



# 답안

// 1. 입력: 자연수 n => 2~10000
// 2. 출력: n의 소인수를 오름차순으로 담은 배열

// for문 돌릴건데, i는 2부터 n까지고, i % n === 0 이면 i를 빈배열에 push 
// 근데 중복 없어야하니까 배열에 i가 있는지 확인하고 push
// n을 i로 나눈 몫으로 계속 갱신해야함 -> for문 안에 while문 사용



function solution(n) {
    let answer = [];
    for (let i = 2; i <= n; i++) {
        while (n % i === 0) {
            if (!answer.includes(i)) {
                answer.push(i);
            }
            n /= i;
        }
    }
    return answer;
}

 

solution(12)를 실행할 때, 다음과 같은 과정이 진행된다.

 

  1. 초기에 n은 12이고, i는 2부터 시작한다.

  2. 처음에는 i가 2이므로 n(12) % i(2)는 0이다. 따라서 while 루프 본문이 실행된다.
    answer 배열에는 아직 2가 포함되어 있지 않으므로, answer 배열에 2를 추가한다.  // answer = [2]
    n(12)을 i(2)로 나눈 값인 6을 다시 n에 할당한다.  // n = 6

  3. 다시 i가 2로 while 루프가 실행된다. (while 루프의 조건이 true이면, while 루프 내부의 코드가 계속 실행되므로, i 는 해당 루프 내부에서 증가하지 않는다.)
    이번에도 n(6) % i(2)가 0이므로 while 루프 본문이 실행된다.
    if 조건에서 answer 배열에는 이미 i(2)가 포함되어 있으므로, 추가하지 않는다.
    n(6)i(2)로 나눈 값인 3을 다시 n에 할당한다.  // n = 3


  4. 이제 i가 2이지만 n(3) % i(2)가 0이 아니므로 while 루프를 벗어난다.
    그 후 i는 3으로 증가한다.  // i = 3

  5. i가 3일 때, n(3) % i(3)가 0이므로 while 루프 본문이 실행된다.
    answer 배열에는 아직 3이 포함되어 있지 않으므로, answer 배열에 3을 추가한다.  // answer = [2, 3]
    n(3)을 i(3)로 나눈 값인 1을 다시 n에 할당한다.  // n = 1

  6. 이제 i가 3이지만 n(1) % i(3)가 0이 아니므로 while 루프를 벗어난다.
    그 후 i는 4로 증가한다.  // i = 4
    이제 i(4)가 n(1)보다 커서 for 루프가 종료되고, answer 배열인 [2, 3]이 반환된다.
728x90