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

나누어 떨어지는 숫자 배열


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


제한사항

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

테스트 케이스

arrdivisorreturn
[5, 9, 7, 10]5[5, 10]
[2, 36, 1, 3]1[1, 2, 3, 36]
[3,2,6]10[-1]

내 풀이

function solution(arr, divisor) {
    var answer = [];
    arr.map((num)=>{
        num%divisor === 0 && answer.push(num)
    })
    answer.length===0 ? answer.push(-1) : answer.sort((a,b)=>(a-b)) ;
    return answer
}
  1. 정답을 넣을 빈 배열을 만든다.
  2. map 함수를 이용해 arr 요소를 divisor로 나누어 떨어지는 요소들만 빈배열에 push 한다.
  3. 나누어 떨어지지 않은 수는 answer.length 를 이용해 length가 0 (빈배열)이면 -1을 push 한다.
  4. 그렇지 않으면 (나누어 떨어지는 요소들은), sort 함수를 이용해 정렬한다.
  5. 여기서 sort 함수는 문자열의 유니코드로 정렬하기 때문에 36을 3으로 인식한다.
    따라서 (a,b)=>(a-b) 콜백함수를 인자로 넣어서 커스컴하여 오름차순 정렬한다.
  6. answer 을 return 한다.


고민했던 점 & 배운 점

고민했던 부분 : [-1]을 반환하는 예외 처리하기
length 로 구별할 생각을 못하고 '나누어 떨어지는 수 vs 그렇지 않은 수' 삼항연산자로 접근했다.

function solution(arr, divisor) {
  var answer = [];
  arr.map((num) => {
    num % divisor === 0 ? answer.push(num) : answer.push(-1)
  });
  return answer.sort((a, b) => a - b);
}

이렇게 하니

  • 나누어 떨어지지 않는 수들도 다 -1로 push 되니까[-1,-1,-1] 이 return 되고...🤦
  • 그럼 if, else 말고 ture 만 반환하는게 좋겠군.. 까지는 바로 알았다....
  • 그럼 -1은 어떻게 반환하지...?😵‍💫
    map 함수 밖에서 얼리 리턴을 해야하나? 아니 그럼 배열을 다 못돌잖아...??
    이러다가 filter 쓰고 삼항연산자 썼다가 map밖에서 for 돌렸다가 아주 삽질을 했더랬다...ㅎ

그러다가 마지막 테스트 결과가 빈 배열인 것을 발견하고, 배열의 길이가 뙇 눈에 들어왔다!
그리고 마음의 평화...내게 강같은 평화...🌿

배운 점

  1. sort 함수는 정렬할 배열의 요소 개수가 2개 미만이면 ‘sort is not a function’ 오류가 난다.
  2. push() 는 배열의 길이를 반환한다.
    return answer.length===0 ? answer.push(-1) : answer.sort((a,b)=>(a-b)) ;
  • answer.push(-1) 하면 1이 나옴.
    arr를 return 해야하는 건 알았는데...대체 왜 1이지?
    음수를 인식 못하나? 왜 하필 1이지? 콘솔에 3 넣어보고 -8 넣어보니 1씩 늘어나는게 length 같았다.
  • push() 함수를 구글링 해보니 역시나 length를 반환한단다...ㅎ
    이것도 몰랐던 나란 빠가사리... 반성하자...이제라도 알았으면 됐다....ㅋ

그룹스터디 팀원 코드 리뷰 이후 느낀 점
4/22 예정

좋은 웹페이지 즐겨찾기