array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.
divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.
arr은 자연수를 담은 배열입니다.
정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j] 입니다.
divisor는 자연수입니다.
array는 길이 1 이상인 배열입니다.
arr | divisor |
---|---|
[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()
를 이용해 오름차순으로 정렬해 주었다.
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()
를 사용하여 값을 하나하나 꺼내준 다음 검사하는 방법도 있다.
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);
}
반복문을 이용해서도 풀 수가 있다. 참고로 가져와 봤다.