고차함수 reduce 다루기, studentReports
문제 : 학생의 정보가 담긴 객체를 요소로 갖는 배열을 입력받아 아래 조건에 맞게 변형된 배열을 리턴해야 합니다.
1. 남학생들의 정보는 리턴하는 배열에서 제외합니다.
2. 'grades' 속성값은 평균값(number 타입)으로 바꿉니다.
주의사항 : 반복문 사용금지. 배열을 리턴해야 합니다. 배열로 되어 있는 학생들의 성적을 number 타입의 평균값으로 변형해야 합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
function studentReports(students) {
// 일단 여자만 필터
let onlyGirls = students.filter((el) => {
return el.gender === 'female';
})
//students배열의 객체요소들 안에있는 grades 배열을 평균값으로 바꿔주자!!
return onlyGirls.map((el)=> { // 우선 배열안의 모든 요소에 적용해야 하니까 map사용
let sum = el.grades.reduce((acc, cur)=>{ // grades속성의 배열에 있는 수를 모두 더해서 sum에 할당!!
return acc + cur
})
let average = sum / el.grades.length // 평균을 구해서
el.grades = average // 객체안의 grades 속성값이 배열이 였던것을 평균값으로 바꿔주고
return el; // 리턴을 해준다. el 객체요소가 배열에 담겨서 리턴된다.
})
}
|
cs |
배열 메소드이자 고차함수 reduce를 활용한 문제이다. reduce 원리에 대해서 이해하고있지 못한다면 어려울 것이다. 배열 메소드 filter, map, reduce 중에서 나는 reduce가 가장 어렵다. 활용을 어떻게 하냐에 따라 다양한 일을 할 수 있기 때문에 어려운 것 같다. 이미 작성되어있는 것을 보면 이해가 되는데, 내가 어떤 문제를 해결하기 위해서 reduce 함수를 이렇게 써야겠다라는 생각은 잘 안든다. 어찌됐든 위 문제를 보면 배열 안에 여학생들의 자료 중에서 grades속성을 바꿔주는 문제이다. 여기서 grades 값은 배열인데 이 배열안의 수를 모두 더해서 평균값으로 바꿔줘야 한다. 즉, 배열에서 숫자로 바꿔줘야 한다. 이 문제를 해결하기 위해서는 나눠서 생각하는 게 좋다. 그래서 우선 여학생들만 있는 자료로 필터링을 해주고, 남은 자료 중에서 grades 속성 모두를 바꿔 주어야 하니까 map으로 접근한다. 그리고 그 안에서 바로 reduce를 리턴하는게 아니라 평균을 구하기 위한 방법으로 reduce 함수를 사용해서 평균 값을 구하고, map 함수를 이용해서 grades 속성을 바꿔주면 문제가 해결된다.
'학습 TIL > Algorithm' 카테고리의 다른 글
[프로그래머스/JavaScript/js] 조이스틱 (0) | 2021.10.17 |
---|---|
[프로그래머스/JavaScript/js] 최소직사각형 (0) | 2021.10.14 |
가장 짧은 문자열과 가장 긴 문자열 제거, removeExtremes (0) | 2021.08.18 |
홀수 사이에만 '-' 넣기, insertDash (0) | 2021.08.18 |
3개 이상 연속되는 문자 압축하기, compressString (0) | 2021.08.18 |