나누어 떨어지는 숫자 배열(Javascript)

·2022년 9월 17일
0
post-thumbnail

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

제한사항

arr은 자연수를 담은 배열입니다.
정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j] 입니다.
divisor는 자연수입니다.
array는 길이 1 이상인 배열입니다.

입출력 예

arrdivisor
[5, 9, 7, 10]5
[2, 36, 1, 3]1
[3,2,6]10

입출력 예 설명

입출력 예#1
arr의 원소 중 5로 나누어 떨어지는 원소는 5와 10입니다. 따라서 [5, 10]을 리턴합니다.

입출력 예#2
arr의 모든 원소는 1으로 나누어 떨어집니다. 원소를 오름차순으로 정렬해 [1, 2, 3, 36]을 리턴합니다.

입출력 예#3
3, 2, 6은 10으로 나누어 떨어지지 않습니다. 나누어 떨어지는 원소가 없으므로 [-1]을 리턴합니다.

나의 풀이

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

앞에 풀었던 문제들과 유사한 듯 하다. filter() 함수로 나누기 5를 했을 때 나머지가 0인 것들만 골라준 다음, 배열이 비었다면 -1, 아니라면 배열을 sort()를 이용해 오름차순으로 정렬해 주었다.

참고할 풀이 1

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

}

나는 filter() 기능을 사용해 줬는데, 이 경우에는 map()을 사용해서 조건을 검사한다음 그 값이 참이라면 빈 배열에 push() 기능을 사용하여 값을 배열에 넣어 주었다.

이런식으로 논리연산자(여기서는 &&)는 원래의 기능이 아닌 값을 빠르게 평가하는 용도로 쓸 수 있는데, 이것을 쇼트 서킷(short-circuit)이라고 한다. 왜냐하면 자바스크립트는 논리값을 왼쪽에서 오른쪽으로 검사하기 때문이다. 예를 들어,

false && anything is short-circuit evaluated to false.
true || anything is short-circuit evaluated to true.

이런 식으로 연산자(and)의 왼쪽 값이 거짓이라면 이미 결과값은 거짓이므로 왼쪽 값만 평가 후 그 다음으로 넘어가게 된다. ||연산자(or) 에서 왼쪽 값이 참이라면 이미 결과값은 참이므로 왼쪽 값 평가 후 그 다음으로 넘어간다. 쇼트 서킷을 활용하면 값을 더 빠르게 검사할 수 있다.

Map()말고도 forEach()를 사용하여 값을 하나하나 꺼내준 다음 검사하는 방법도 있다.

참고할 풀이 2

function solution(arr, divisor) {
    var answer = [];

    for(var i = 0; i < arr.length; ++i) {
        if(arr[i] % divisor == 0) answer.push(arr[i]);
    }

    return answer.length < 1 ? [-1] : answer.sort((a, b) => a - b);
}

반복문을 이용해서도 풀 수가 있다. 참고로 가져와 봤다.

profile
전 이것도 몰라요

0개의 댓글

관련 채용 정보