The journey to becoming a developer

My future is created by what I do today, not tomorrow.

Algorithms/Programmers

[프로그래머스 Level 1] 나누어 떨어지는 숫자 배열 (자바스크립트)

Millie 2021. 10. 16. 14:24

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

 

논리 연산자

 

ko.javascript.info

여기서 && 연산자의 원리에 대해 아주 상세하게 설명하고 있어서 도움을 많이 받았다. 

논리 연산자는 우항과 좌항의 피연산자(부정 논리 연산자의 경우 우항의 피연산자)를 논리 연산한다. ||, &&, !가 있다. 

&& (AND) 연산자는 첫 번째 falsy를 반환한다. 

피연산자에 falsy가 없다면 마지막 값을 반환한다. 이것을 이용하여 위 풀이에서는 만약 배열의 요소가 divisor로 나눠서 나머지가 0이라면, 즉 true라면 arr.push(v)가 실행되도록 한 것이다. 

콘솔에 true && alert('hi")라고 해 보면 쉽게 이해할 수 있다. 우항이 항상 참이기 때문에 좌항인 alert가 실행된다. 

false && alert('hi') 로 하면 실행되지 않는다. 

 

참고자료

JavaScript Deep Dive