js/[문제풀이] programmers

[js] 평균 소득액 구하기_Disaster Assistance Amount

우금붕 2023. 1. 12. 10:57

[문제 설명]

재난 지원금을 지급하기 위해 국민의 평균 소득액을 구하려고 합니다.
국민의 소득을 그대로 평균 내면 잡음이 심하여, 최상위 최하위 1건씩 제외한 소득 평균을 출력하는 함수, solution을 완성해주세요.
예를 들어, 국민의 소득액 arr가 [1, 3, 3, 3, 5]일 때, 최상위 최하위 1건씩 제외한 소득 평균은 3입니다.


[제한 사항]

- 국민의 소득액 arr는 정렬되어있지 않습니다.
- 평균의 소수점은 절삭 후 출력합니다.


[입력 형식]

- 국민의 소득액 정보 arr는 길이가 1 이상 1\,000 이하의 배열입니다.
- 소득액인 arr의 각 요소는 0 이상 1\,000\,000 이하의 정수입니다.


[출력 형식]

- 최상위 최하위 1건씩 제외한 소득 평균을 int 형식으로 출력합니다.

 

 

[문제 풀이]

function solution(arr) {
    arr.sort((a, b) => a - b);
    arr.pop();
    arr.shift();

    let result = arr.reduce(function add(sum, n) {
        return sum + n;}, 0);

    return Math.floor(result / arr.length);

}

 

[해설]

arr.sort로 배열을 오름차순으로 정렬합니다.

pop 함수와 shift 함수로 배열의 가장 앞, 뒤의 요소를 제거합니다.

reduce 함수로 배열의 합을 구하고, Math.floor로 소수점을 버린 정수 평균을 구합니다.

 

 

 

 

*arr.sort([compareFunction])

배열의 요소를 적절한 위치에 정렬한 후 그 배열을 반환하는 메서드여기서 compareFunction은 매개변수. 정렬 순서를 정의합니다.

  • 생략시 : 유니코드 포인트 순서로 문자열 비교 정렬
  • a ,b 두개의 element를 파라미터로 입력 받는 경우
    - compareFunction(a, b) < 0 : a가 먼저 옴
    - compareFunction(a, b) == 0 : 변경 X
    - compareFunction(a, b) > 0 : b가 먼저 옴

문자열 대신 숫자를 비교하기 위해서 아래와 같은 코드를 작성할 수 있습니다.

이때 숫자 배열은 오름차순으로 정렬합니다.

function compareNumbers(a, b) {
  return a - b;
}

 

*.pop() ↔ .push()

배열에서 마지막 요소를 제거하고 그 요소를 반환합니다.

배열에 마지막 요소 값을 추가하는 함수는 .push()

 

*.shift()  .unshift()

배열에서 첫 번째 요소를 제거하고 제거된 요소를 반환합니다.

이 메서드는 배열의 길이를 변하게 합니다.

배열에 첫 번째 요소의 값을 추가하는 함수는 .unshift()

 

*.reduce()

배열의 각 요소에 주어진 리듀서(reducer) 함수를 실행하고 하나의 결과값을 반환합니다.

배열의 모든 값을 합산하려면 아래와 같은 형식으로 작성할 수 있습니다.

var sum = [0, 1, 2, 3].reduce(function (accumulator, currentValue) {
  return accumulator + currentValue;
}, 0);


/* 화살표 함수로 작성 */
var total = [ 0, 1, 2, 3 ].reduce(
  ( accumulator, currentValue ) => accumulator + currentValue,
  0
);

그 외의 쓰임은 포스팅 아래 MDN 사이트를 참고해주세요.

 

* Math.floor()

주어진 숫자와 같거나 작은 정수 중에서 가장 큰 수를 반환합니다.그외 Math.ceil()소수점 올림, Math.round()소수점 반올림

 

 

 

[다른 사람 풀이]

function solution(arr) {
    arr.sort((a, b) => a - b);
    arr.shift();
    arr.pop();

  return parseInt(arr.reduce((a, b) => a + b) / arr.length);
}

제가 작성한 코드와 거의 같은 맥락입니다.

실수를 정수로 변환할 때는 Math.floor() 대신 parseInt()도 사용할 수 있다는 점을 보여드리려고 가져왔습니다..

 

 

*parseInt()

(mdn) 문자열 인자를 파싱하여 특정 진수의 진수의 정수를 반환합니다.

실수나 string 객체를 정수로 변환할 수 있으며 변환된 타입은 모두 Number입니다.

 

 

[느낀점]

다양한 함수를 적절하게 사용했을 때 , 간결하고 가독성 좋은 코드를 작성할 수 있다는 부분을 다시 한 번 알았습니다.

mdn 사이트를 자주 접속하여 함수들의 기능을 익힐 수 있도록 하려 합니다.

 

 

 

 

 

[github] - DisasterAssistanceAmount.js

(mdn) Array.prototype.reduce() - JavaScript | MDN (mozilla.org)