프로그래머스 : 나누어 떨어지는 숫자 배열

윤뿔소·2022년 9월 7일
0

Agorithm 문제풀이

목록 보기
1/2
post-thumbnail

사이트를 올리고 나의 코드를 보며 문제점을 관찰하자

문제

프로그래머스 : 나누어 떨어지는 숫자 배열

sort의 문제

우리는 배열과 객체에서 오름차순으로 만들어야할 때가 온다. 그럴때마다 obj(arr).sort()라는 메소드를 필수적으로 써야한다. 유니코드 코드포인트에 따라 정렬된다.

const months = ['March', 'Jan', 'Feb', 'Dec'];
months.sort();
console.log(months);
// ["Dec", "Feb", "Jan", "March"]

const array1 = [1, 30, 4, 21, 100000];
array1.sort();
console.log(array1);
// [1, 100000, 21, 30, 4]

위 코드에서 문제가 무엇인지 발견했는가? sort()메소드는 괄호 안에 아무 것도 주어지지 않는다면 배열들이 문자열로 변환된 다음 맨 앞의 자릿수만 비교해 저런 결과가 나타난다. 알파벳처럼 순위가 정해진다는 뜻 그래서 괄호 안에 compareFunction라는 걸 집어 넣는다.

해결법

sort() 괄호 안에 compareFunction을 집어 넣는다. 즉 compare 함수가 내장돼 있어 두개의 값이 비교돼 작거나 크면 1, -1을 반환해 차순을 조정한다. 그래서 함수를 넣어줘 변수인 a와 b를 할당해줘 비교한다.

const array1 = [1, 30, 4, 21, 100000];
// 정석 : 익명함수를 입력, compare 함수 안에 써주니 함수 안 함수의 중첩 구조이다.
array1.sort(function (a, b) {return a - b});
// 화살표 함수
array1.sort((a, b) => a - b);
console.log(array1);
// [1, 100000, 21, 30, 4]

내가 푼 코드

function solution(arr, divisor) {
  let answer = [];
  if (arr.length > 0) {
    for (i = 0; i < arr.length; i++) {
      if (arr[i] % divisor === 0) {
        answer.push(arr[i])
      }
    }
  }
  if (answer.length === 0) {
    answer.push(-1)
  }
  answer.sort((a, b) => a - b)
  return answer;
}
  • 보시다시피 엄청 원시적이다. 메모리 낭비가 있는 상태.
  • filter, map 등의 고차 함수(Higher-Order Function)들을 사용하지도 않았고, 삼항연산자도 안써줬다.

예시 코드

이걸 보며 비교해보자. 알아가자

function solution(arr, divisor) {
  // 고차 함수로 위의 for-if를 콜백 함수를 인수로 받아 줄여준 모습
  const answer = arr.filter(i => i % divisor === 0);
  // 삼항 연산자로 return에 압축
  return answer.length !== 0 ? answer.sort((a, b) => a - b) : [-1];
}

결론

  • 고차 함수에 대해서 더 파보자 재밌겠다.
  • 삼항 연산자로 간단하게 압축 가능하다. 삼항 연산자를 의식적으로 활용해보자
profile
코뿔소처럼 저돌적으로

0개의 댓글