본문 바로가기
알고리즘

[프로그래머스][JS] Lv.1 나누어 떨어지는 숫자 배열

by codnjs779 2022. 9. 23.

문제 설명

array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.
divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.

제한사항
  • arr은 자연수를 담은 배열입니다.
  • 정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j] 입니다.
  • divisor는 자연수입니다.
  • array는 길이 1 이상인 배열입니다.
입출력 예
[5, 9, 7, 10] 5 [5, 10]
[2, 36, 1, 3] 1 [1, 2, 3, 36]
[3,2,6] 10 [-1]

 

 

A. 생각한 풀이 방법

1. 나머지 값 0 인 배열 filter 함수 통해 거르기

2. 오름차순 배열로 반환하기 위해 sort 함수 사용

3. 나머지값 0인 값이 없을 때 -1 리턴하는 조건문 

 

B. 해결 과정

const solution = (arr, divisor) => {
    const res = arr.filter(item => item % divisor === 0 )
    if(res.length === 0){
        const zero = [-1]
        return (zero)
    }
    return (res)
}

 

이렇게 했더니 오류 발생! 오름차순 조건을 까먹고 sort함수 사용하지 않음

const solution = (arr, divisor) => {
    const res = arr.filter(item => item % divisor === 0 ).sort((a,b) => a - b )
    if(res.length === 0){
        const zero = [-1]
        return (zero)
    }
    return (res)
}

처음에 그냥 arr.sort()로 써줬는데 모든 테스트 값들이 오름차순으로 정렬되지 않았다.

 

왜? 

배열 정렬할 때 요소를 문자열로 취급해서 정렬하기 때문 => [2, 26, 1, 3]를 예로 들어보면, 배열을 정렬 시, 

[1,2,26,3]으로 리턴하게 된다. 문자열로 변환되었을 때 "26" < "3" 첫 글자 2 vs 3으로 비교되기 때문.

그래서 sort 함수에 두 수 를 비교해서 정렬하는 식 작성해야 함.

 

----

다른 사람 풀이 

function solution(arr, divisor) {
    var answer = arr.filter(v => v%divisor == 0);
    return answer.length == 0 ? [-1] : answer.sort((a,b) => a-b);
}

비슷한데 위 방법은 조건문을 삼항 연산자로 써줌