프로그래머스 레벨 1 - 평균 구하기 정답 및 풀이[자바스크립트]
https://school.programmers.co.kr/learn/courses/30/lessons/12944
문제
정수를 담고 있는 배열 arr의 평균값을 return 하는 문제. 문제 자체는 너무나도 간단해요.
제한사항
배열 arr은 길이 1 이상 100 이하, 그리고 원소는 -10,000 과 10,000 사이의 정수에요.
단순 for문을 돌려서 풀어도 성능에는 이슈가 없었기 때문에 신경써서 볼 부분은 아닌 듯 하네요.
답
function solution(arr) {
var answer = 0; //배열의 값을 모두 더하기 위한 변수
for(let i=0;i<arr.length;i++) { //for문을 돌려 값을 모두 넣어준다.
answer += arr[i];
}
// 더한 모든 수를 배열의 길이로 나눈다.
return answer / arr.length;
}
소스 내에 주석으로 모든 풀이가 가능한 간단한 답이에요. 수학에서 평균을 배울 때 각각의 값을 모두 더하고 그 수의 갯수만큼 나눈다, 라는 공식을 알고 있어서 그대로 풀이에 적용했어요.
다른 사람의 풀이
for문 대신 사용할 수 있는 다른 방법들이 있었어요.
먼저 배열에 reduce() 함수를 적용하여 각 값을 더해주는 방법.
reduce() 함수는 개념을 이해했는데도 오랜만에 보면 다시 헷갈리네요. 자주 써먹지 않으면 금방 까먹어버리는데 머리가 안좋은건지 다른 분들도 그런건지는 모르겠지만..
reduce() 함수의 기본은 배열의 값 하나하나씩 순회를 돌며 '현재의 값' 과 '순회를 돌며 이벤트가 적용된 총 값' 을 비교하여 계산을 할 수 있어요.
화살표 함수를 써서 가장 간단한 예제를 이 문제에 적용시켜 보면
arr.reduce((a,b) => a+b)
이런 형태가 될거에요. 이 예제의 풀이는
arr이라는 배열이 [1,2,3] 이라고 가정했을 때, reduce() 함수는 원소의 갯수인 3만큼 순회를 돌아요.
그리고 3번의 순회를 돌며 바라보고 있는 값을 a로 갖고있어요.
그리고 b에는 순회를 돌 때마다 적용이 된 값을 갖고있어요.
작동순서를 살펴보면
첫번째, a에는 1을 갖고 있고 b는 0을 갖고 있는 상태. a+b = 1+0 = 1
두번째, a에는 2를 갖고 있고 b는 1을 갖고 있는 상태(첫번째에서 계산한 값이 1이기 때문.) a+b = 2+1 = 3
세번째, a에는 3을 갖고 있고 b는 3을 갖고 있는 상태(두번째에서 계산한 값이 3이기 때문.) a+b = 3+3 = 6
그리하여 최종적으로 6이라는 수를 return 하게 될거에요.
이 예제를 활용하여 배열의 각 값을 for문을 사용하지 않고 더할 수 있게 돼요.
reduce() 함수는 그 외에도 순회하고 있는 상태의 index와 총 배열의 형태까지 총 4개를 인자로 가질 수 있어요.
자세한 reduce()의 함수는 아래의 링크에서 보고 확인해보세요.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce
이건 예전 코딩 테스트 풀 때도 적은 개념이지만 제가 헷갈려서 다시한번 정리해봤어요.