:ledger: 문제 설명

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

:one: 제한사항

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

:two: 입출력 예

arr divisor return
[5, 9, 7, 10] 5 [5, 10]
[2, 36, 1, 3] 1 [1, 2, 3, 36]
[3, 2, 6] 10 [-1 ]

:three: 입출력 예 설명

:pushpin: 3-1) 입출력 예 설명 #1

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

:pushpin: 3-2) 입출력 예 설명 #2

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

:pushpin: 3-3) 입출력 예 설명 #3

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

:four: 프로그래머스에서 제공한 코드

처음 프로그래머스에서 작성된 코드는 아래와 같다.

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

:ledger: 문제 풀이

const solution = (arr, divisor) => {
  let x = [];
  for (let i = 0; i <= arr.length; i++) {
    if (arr[i] % divisor === 0) x.push(arr[i]);
  }
  x.length === 0 ? x.push(-1) : x.sort((a, b) => a - b);
  return x;
};

:one: 함수 선언

  • 화살표 함수를 사용하여 arr, divisor 매개변수를 받는다.

:two: 풀이

  • 먼저 배열을 return 하기 위해 변수 x를 선언한다.
  • 이후 arr의 length 값으로 반복문을 실행한다.
  • 실행하며 divisor로 나누어 떨어지는 값을 구하기 위해 arr의 길이만큼 반복문을 실행하며 배열마다 arr[i] % divisor === 0 식을 계산하여 true일 경우 변수로 선언한 x에 값을 담아준다.
  • 문제 설명에서 divisior로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 줘야하고 나누어 떨어지면 그 값을 오름차 순으로 정렬한 배열을 반환하기 위해 삼항연산자로 처리했다. x.length === 0 ? x.push(-1) : x.sort((a,b) => a - b); = x의 길이가 0일 경우 x에 -1을 대입한다 그렇지 않을 경우 반복문을 통해 대입한 배열을 오름차 순으로 변환한다

:three: 결과 반환

  • arr이 [5,9,7,10], divisor가 5일 경우 [5,10]을 리턴함
  • arr이 [2,36,1,3], divisor가 1일 경우 [1,2,3,36]을 리턴함
  • arr이 [3,2,6], divisor가 10일 경우 [-1]을 리턴함

:four: 실행

  • console.log(solution([5,9,7,10], 5)) 실행하면 [5,10]이 출력된다.
  • console.log(solution([2,36,1,3], 1)) 실행하면 [1,2,3,36]이 출력된다.
  • console.log(solution([3,2,6], 10)) 실행하면 [-1]이 출력된다.

:fire: 다른 사람의 풀이 참고

filter,map,reduce메서드들과 반복문을 적재적소에 사용하기 위해 생각을 많이 했는데, 이번 문제에서 filter가 생각이 안났다.
아래의 문제 풀이를 보면 answer 변수에 filter메서드를 사용하여 배열 % divisor == 0 값을 넣어주고, 리턴한 방법으로 코드가 많이 간결해졌다.
앞으로 더 고민해보면서 작업해봐야겠다!!

// [20명] filter 메서드를 사용한 문제 풀이
function solution(arr, divisor) {
  var answer = arr.filter((v) => v % divisor == 0);
  return answer.length == 0 ? [-1] : answer.sort((a, b) => a - b);
}

출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges