나누어 떨어지는 숫자 배열

·2022년 3월 21일
0

알고리즘

목록 보기
13/47

이 문제, 정말. 정말.정말 어렵게 풀었다
2차원 배열이 이해가 너무 안되서 진짜 하

두가지 방법으로 풀었는데, 풀이하는 과정에서 몰라서 물어봤던 부분까지 집고 넘어가려고 한다.

function solution(arr, divisor) {
  return arr
    .reduce((a, b) => (b % divisor === 0 ? [...a, b] : a), [])
    .sort(function (a, b) {
      return a - b;
    });
}
function solution(arr, divisor) {
  return arr
    .filter((a) => a % divisor === 0)
    .sort(function (a, b) {
      return a - b;
    });
}

reduce와 filter 두개를 사용해서 문제를 풀어봤다.

정상적으로 풀이가 되지만, 마지막 조건에 맞지 않아서 맨 마지막 테스트가 오답으로 됐다.
마지막 조건은 나누어 떨어지는 값이 없다면, [-1]로 출력하시오.

였는데 이 과정에서 좀 많이 헤맸다. 진짜 지이이이인짜 많이 헤맸다.

왜냐하면

나누어 떨어지는 값이 없을 때, [] 가 출력이 됐다.
근데? []는 null도 undefined도 아니였다.
그래서 별 짓을 다하려고 고민을 해봤는데

filter는 값이 true가 아닐 경우에는 밖으로 나오는 것이 없기 때문에 탈락

reduce에 삼항연산자 조건에 부합할 경우, [-1]을 해봤더니?
true,false,true가 반복 될 경우에 맨 앞의 배열이 [-1]이 되어있는 것을 확인해서 이것도 탈락

그래서 그냥 멘토님께 여쭤봤다 빈 배열을 어떻게 해야 정의를 판별을 할 수 있는가?에 대해서

근데 너무 쉽게, 그리고 배웠음에도 불구하고 ㅋㅋ 빈 배열의 길이는 0이라는 것을....... 망각했다.

그래서 맨 마지막에 한줄이 추가됐다.

arr.length !== 0 ? arr : [-1]

arr의 길이가 0이 아니라면, arr을 그대로 반환하고
arr의 길이가 0이라면 [-1]을 반환한다.

그래서 이렇게 고쳤다

function solution(arr, divisor) {
  let a = arr.filter((a) => a % divisor === 0)
  .sort(function (a, b) {return a - b;});
  return a.length !== 0 ? a : [-1]
}

근데 여기서 문제, Array.sort()는 단독사용하면 제대로 돌아가지가 않는다.
숫자도 문자열로 보기 때문인데, 이것에 관해서는 따로 포스트를 올릴 예정이다
사실 이해가 될랑말랑콕

profile
물류 서비스 Backend Software Developer

0개의 댓글

관련 채용 정보