티스토리 뷰

Algorithm/Level 0

[Level0] 약수 구하기

쩨리쩨리 2024. 1. 12. 09:15
반응형

문제

정수 n이 매개변수로 주어질 때, n의 약수를 오름차순으로 담은 배열을 return하도록 solution 함수를 완성해주세요.

 

제한사항

 

  • 1 ≤ n ≤ 10,000

 

입출력 예시 

  • 예시1
  • 입력 : n = 24
  • 출력 :[1, 2, 3, 4, 6, 8, 12, 24]
  • 설명 : 24 약수를 오름차순으로 담은 배열 [1, 2, 3, 4, 6, 8, 12, 24] return합니다.

 

  • 예시2
  • 입력 : n = 29
  • 출력 :[1, 29]
  • 설명 : 29 약수를 오름차순으로 담은 배열 [1, 29] return합니다.

 


내 풀이

function solution(n) {
    return Array(n).fill(1).map((v,i) => v + i).filter((_, idx) => n % (idx+1) === 0);
}


console.log(solution(24));
console.log(solution(29));

 

  • 시간 복잡도 : O(n)
  • 설명 : 이 코드는 주어진 n 대해 1부터 n까지의 자연수 중에서 n 약수를 찾아내는 역할을 한다.
    Array(n).fill(1) 길이가 n이고 모든 요소가 1 채워진 배열을 생성한다.
    map((v, i) => v + i) 사용하여 배열의 요소에 현재 인덱스 i 더해준다. 이렇게 하면 1부터 n까지의 자연수 배열이 만들어진다.
    filter((_, idx) => n % (idx + 1) === 0) 사용하여 현재 인덱스 idx 대해 n (idx + 1) 나누어 떨어지는 경우만을 걸러낸다. 이렇게 하면 n 약수만 남는다.

    Array(n).fill(1).map((v, i) => v + i) 부분의 시간 복잡도는 O(n)이다. 배열을 생성하고 초기화하는 선형 시간이 소요된다.
    filter((_, idx) => n % (idx + 1) === 0) 부분은 O(n)이다. 생성된 배열을 순회하면서 n 나누어 떨어지는지 확인한다.
    따라서 전체 코드의 시간 복잡도는 O(n)이다.

  • 느낀점 : 
    최대한 코드를 간결하고, 주어진 n 대한 약수를 찾는 목적에 맞게 작성하려 했다. 그러나 채점 후 Array(n)을 사용하여 배열을 초기화하고, 나중에 map 및 filter를 사용하는 부분에서 메모리를 많이 소비할 수 있다는 것을 알았다. 이 코드는 주어진 범위에 따라 선형 시간에 처리되는 알고리즘이다. 입력 범위가 적당하다면 효율적으로 동작할 것이다. 그러나 입력 범위가 매우 크다면 선형 시간으로도 부담이 될 수 있으니 이점을 고려하여 사용하는 것이 좋다. 

 


해결 방법

function solution(n) {
    let result = [];
    for (let i = 1; i <= Math.sqrt(n); i++) {
        if(n % i === 0){
            result.push(i);

            if(i !== n/i) result.push(n/i);
        } 
    }
    return result.sort((a,b) => a - b);
}

 

        • 시간 복잡도 : O(sqrt(n))
        • 설명 : 이 코드는 for 루프가 Math.sqrt(n)까지 반복한다. 반복에서 주어진 n 현재 반복 변수 i 나누어 나머지가 0이면, i n 약수이므로 결과 배열에 추가되고, i n/i 하나가 Math.sqrt(n) 같지 않은 경우에만 번째 약수도 추가된다.
          이 코드는 1부터 
          Math.sqrt(n)까지의 수를 반복하며, 현재 i n 약수인지 확인한다. 만약 약수라면, result 배열에 i 추가하고, i n/i 하나가 Math.sqrt(n) 같지 않은 경우에만 번째 약수도 추가한다.
          이 코드는 주어진 문제에 대해 적절한 방식으로 약수를 찾고, 중복을 피하여 정렬까지 수행하고 있으므로 효율적인 코드이다. 약수를 찾는 과정에서 불필요한 반복을 줄이고 있으며, 정렬을 통해 결과를 가독성 있게 반환한다

 

반응형

'Algorithm > Level 0' 카테고리의 다른 글

[Level 0] 정수 배열의 최대 공약수  (0) 2023.08.03
[Level 0] 숫자 빈도수  (0) 2023.08.02
[Level 0] 팬그램(pangram)  (0) 2023.07.27
[Level 0] 정수 반복 계산  (0) 2023.07.27
[Level 0] 문자열 등장 횟수  (0) 2023.07.27
댓글
공지사항