[코테] 나누어 떨어지는 숫자 배열

JulyK9·2022년 12월 22일
0

문제

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

제출코드

function solution(arr, divisor) {

  	// 결과를 담을 변수 선언하고 빈배열 할당
    let resultArr = []

    // 배열의 요소를 돌아가면서 divisor로 나눠주기
    arr.forEach(el => {
        // 떨어지는 요소가 있으면 해당 요소를 오름차순으로 정렬한 배열을 반환
        if(el % divisor === 0) {
            resultArr.push(el)
        }
    })
    resultArr.sort((a, b) => a - b)

    // 떨어지는 요소가 하나도 없다면 배열에 -1 담아 반환
    if(resultArr.length === 0) {
        resultArr.push(-1)
    }
    return resultArr
}

접근과정

  • forEach는 반환값이 undefined 이기 때문에 결과에 바로 sort() 메서드를 해줄 수 없음
  • 따라서 forEach 가 모두 돌아간후 나온 결과인 resultArr에 sort()를 하고 오름차순으로 정렬되도록 sort((a, b) => a - b)를 적용
  • 여기까지 했는데 나누어 떨어지는 요소가 없다면 배열에 -1을 담아 반환하도록 함.
    => 근데 생각해보니 나누어 떨어지는 요소가 없는데 불필요하게 sort를 해줄 필요가 없음. 그래서 코드를 조금 변경해보았다.
function solution(arr, divisor) {

    let resultArr = []

    // 배열의 요소를 돌아가면서 divisor로 나눠주기
    arr.forEach(el => {
        // 떨어지는 요소가 있으면 해당 요소를 오름차순으로 정렬한 배열을 반환
        if(el % divisor === 0) {
            resultArr.push(el)
        }
    })

    // 떨어지는 요소가 하나도 없다면 배열에 -1 담고
    if(resultArr.length === 0) {
        resultArr.push(-1)
    }
    // 그게 아니라면(떨어지는 요소가 있으면) sort 적용
    else {
        resultArr.sort((a, b) => a - b)
    }
    // 결과를 반환
    return resultArr
}

불필요한 연산 적용을 배제하거나 가독성 면에서도 이게 좀 더 나은 것 같다.


다른 풀이 1.

function solution(arr, divisor) {
    var answer = arr.filter(v => v%divisor == 0);
    return answer.length == 0 ? [-1] : answer.sort((a,b) => a-b);
}
  • filter() 메서드와 삼항연산자로 깔끔하게 정리 굿굿
    => 입력값과 출력값이 모두 배열이면서 특정 조건을 만족하는 요소만 뽑아내는(필터링) 경우이면 filter를 생각해볼 수 있는데 쉽게 생각을 못한 것 같다.

다른 풀이 2.

function solution(arr, divisor) {
    var answer = [];
    arr.map((o) => {
        o % divisor === 0 && answer.push(o);
    })
    return answer.length ? answer.sort((a, b) => a - b) : [-1];
}
  • map() 메서드를 사용했다. forEach 와 map의 차이점을 알고 가면 좋을 것 같다.
  • 가장 큰 차이는 리턴값의 유무, 기존 배열의 변경 유무 이다.
  • 성능적인 면의 차이는 잘 모르겠는데, 리액트를 배우다보니 기존 array는 가급적 변경하지 않는게 좋다고 들은 것 같다. 다음부터는 map을 가급적 이용해보도록 해야겠다.

참고자료

profile
느리지만 꾸준하게. 부족하거나 잘못된 부분은 알려주시면 감사하겠습니다.

0개의 댓글