Description
array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.
Constraints
- arr은 자연수를 담은 배열입니다.
- 정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j] 입니다.
- divisor는 자연수입니다.
- array는 길이 1 이상인 배열입니다.
My Solution
(1) filter 사용
function solution(arr, divisor) {
const newarr = arr.filter(v => v % divisor === 0);
return newarr.length === 0 ? [-1] : newarr.sort((a, b) => a - b);
}
(2) 반복문과 조건문 사용
function solution(arr, divisor) {
let answer = [];
for (let element of arr) {
if (element % divisor === 0) answer.push(element);
}
return answer.length === 0 ? [-1] : answer.sort((a, b) => a - b);
}
Other's Solution
(1) 나의 첫 번째 풀이와 유사
function solution(arr, divisor) {
var _ = arr.filter(e => !(e % divisor));
return _[0] ? _.sort(($, _) => $ - _) : [-1];
}
나의 풀이와 차이점은 filter의 콜백 함수 부분에서 ! 연산자를 사용해 좀 더 간소화했다.
또한 리턴할 때 삼항 연산자의 조건을 배열의 첫 요소에 값이 숫자인지 아닌지로 설정하였다. (_[0])
만약 _가 아무 요소가 없는 빈 배열이라면, _[0]은 undefined가 되고, 그럴 경우 [-1]을 리턴하게 된다.
(2) 나의 두 번째 풀이와 유사
function solution(arr, divisor) {
var answer = [];
for (var i = 0; i < arr.length; i++)
if (arr[i] % divisor == 0) answer.push(arr[i]);
if (answer.length == 0) answer = [-1];
else
answer = answer.sort(function (a, b) {
return a - b;
});
return answer;
}
(3) map, && operator
function solution(arr, divisor) {
let answer = [];
arr.map(v => v % divisor === 0 && answer.push(v));
return answer.length ? answer.sort((a, b) => a - b) : [-1];
}
map 메서드를 이용해서도 이 문제를 해결할 수 있는데, && 연산자와 함께 활용해야 한다.
&& 연산자의 문법을 잘 알고 있어야 이렇게 로직을 짤 수 있다. 그래서 && 연산자에 대해 짚고 넘어가려고 한다.
Logical operator
여기서 && 연산자의 원리에 대해 아주 상세하게 설명하고 있어서 도움을 많이 받았다.
논리 연산자는 우항과 좌항의 피연산자(부정 논리 연산자의 경우 우항의 피연산자)를 논리 연산한다. ||, &&, !가 있다.
&& (AND) 연산자는 첫 번째 falsy를 반환한다.
피연산자에 falsy가 없다면 마지막 값을 반환한다. 이것을 이용하여 위 풀이에서는 만약 배열의 요소가 divisor로 나눠서 나머지가 0이라면, 즉 true라면 arr.push(v)가 실행되도록 한 것이다.
콘솔에 true && alert('hi")라고 해 보면 쉽게 이해할 수 있다. 우항이 항상 참이기 때문에 좌항인 alert가 실행된다.
false && alert('hi') 로 하면 실행되지 않는다.
참고자료
JavaScript Deep Dive
'Algorithms > Programmers' 카테고리의 다른 글
[프로그래머스 Level 1] 나머지가 1이 되는 수 찾기 (자바스크립트) (0) | 2021.10.17 |
---|---|
[프로그래머스 Level 1] 가운데 글자 가져오기 (자바스크립트) (0) | 2021.10.17 |
[프로그래머스 Level 1] 두 정수 사이의 합 (자바스크립트) (0) | 2021.10.16 |
[프로그래머스 Level 1] 문자열 내림차순으로 정렬하기 (자바스크립트) (0) | 2021.10.14 |
[프로그래머스 Level 1] 문자열 다루기 기본 (자바스크립트) (0) | 2021.10.13 |