문제 -고차함수-
고차함수 문제
문제 6 번.
함수들을 입력받아 함수들이 입력된 차례대로 결합된 새로운 함수를 리턴하라!
인자 1 : func1 -> number타입을 입력받아 number타입을 리턴하는 함수
인자 2 : func2 -> number타입을 입력받아 number타입을 리턴하는 함수
인자 3 : funcN -> number타입을 입력받아 number타입을 리턴하는 함수
출력 - 함수를 리턴해야 한다.
리턴되는 함수는 정수를 입력받아 func1, func2, ... m funcN 의 순으로 적용한다.
-주의사항-
입력되는 함수들의 수는 1개 이상이라고 가정한다.
함수가 아닌 입력은 존재하지 않는다고 가정한다.
입력받은 함수들이 어떤 일을 하는지는 중요하지 않다.
코드 작성
설명
function pipe(...funcN) { // rest parameter문법을 사용하여 매개변수에 ...funcN 넣어주면 함수 내부로 들어가면 []배열로 감싸져 나열된다. -> [func1,func2,...funcN]
return function (num) { // 함수를 리턴해주며 인자로 임의의값 num이라 써준다.
let result = num; // num이라는 매개변수는 이 함수에 들어와 함수에 적용시키며 값이 변할수도 있다. 그대로 num으로 써도된다. 굳이 변수에 선언시키고 할당 안해도됨. 그냥 썻음
for (let i = 0; i < funcN.length; i++) { // 함수들은 지금 배열에 나열되어있다. funcN = [함수,함수...함수] 이므로 배열의 length를 알수 있다.
result = funcN[i](result); // [i]번째 함수에 result를 적용시킨값을 다시 result에 할당 시켜줌으로써 pipe()의 매개변수로 오는 모든 함수에 num인자를 적용시킬수 있다.
}
return result;
};
}
문제 26 번.
객체를 요소로 갖는 배열과 문자열을 입력받아 각 요소의 'animal' 속성값이 문자열과 일치할 경우, 해당 요소의 'score' 속성값을 모두 더한 값을 리턴하라!
입력
인자 1 : records -> 객체를 요소로 갖는 배열
인자 2 : value -> string 타입의 문자열
출력
number 타입을 리턴!
-주의사항-
반복문(for, while) 사용은 금지!
빈 배열을 입력받은 경우 -> 0을 리턴!
코드 작성
설명
function calculateScore(records, value) {
let newArr = records
.filter((el) => {
return el.animal === value;
}) // el.animal 속성값이 value와 같은 el 만 빼온다.
.map((el) => {
return el.score;
}) // el의 score속성값으로만 이루어진 배열을 만든다.
.reduce((acc, cur) => {
return acc + cur;
}, 0); // initialValue를 0으로 제공하고, 처리할 현재요소들을 누적값에 더해준다. initialValue를 0으로 함으로써 빈배열이 들어와도 0으로 출력할 수 있다. -> initialValue를 제공하지 않았을 때 빈 배열이 들어오면 에러가 발생한다. 주의!
return newArr;
}
// 위의 코드는 내가 쓴 코드이다. 아래에 더 쉽게 쓰는 코드를 알아보자.
<----------------->
function calculateScore(records, value) {
let newArr = records.reduce((acc,cur) => {
if(cur.animal === value){
return acc + cur.score;
}
else {
return acc;
}
}, 0)
return newArr;
}
// 보고 쓰면서 이해는 했지만, 이렇게 쉽게 쓰는 방법도있다.
// reduce함수 내부에 if문을 넣어 그안에서 누적값,처리할 현재요소, 이니셜벨류 를 잘 지정해두고 쓴다면 훨씬 더 손 쉽게 쓸수 있다.
문제 27 번.
문자열을 요소로 갖는 배열을 입력받아 배열에서 가장 긴 문자열을 리턴하라!
인자 1 : arr -> string 타입을 요소로 갖는 배열
출력 -> string 타입을 리턴해야함!
-주의사항-
반복문(for, while) 사용은 금지!
가장 긴 문자열이 중복이 될 경우 -> 앞 쪽에 있는 요소를 리턴해야함!
빈 배열을 입력받은 경우 -> 빈 문자열을 리턴!.
코드 작성
설명
function getLongestElement(arr) {
let newArr = arr.reduce((acc, cur) => { // reduce()메서드를 사용하여 acc 누적값 cur 처리할 현재요소를 매개변수로 선언
let max = acc; // 아래 조건문에 acc.length,cur.length를 그냥 써도된다. 그냥 max라는 변수에 누적값 즉 초기값을 선언했다.
if (max.length < cur.length) { // 길이 비교
max = cur; // 비교하고 cur.length가 더길면 max에 cur 할당 즉 누적값에 cur 할당!
} else {
max = acc; // cur.length가 더 짧을경우 또는 가장 긴문자열이 중복이 될 경우 그 이전값 즉 누적값그대로 할당
}
return max; // 최종적으로 max를 리턴
}, ""); // initialValue '' 으로 제공! 빈배열 받아도 빈 문자열로 리턴함. 에러발생 X
return newArr; // 선언했던 newArr 리턴!
}
문제 30 번.
배열을 입력받아 배열에서 가장 짧은 길이를 가진 문자열 요소를 리턴하라!
인자 1 : arr -> 임의의 요소가 담긴 배열
출력 -> string 타입을 리턴해야함!
-주의 사항-
반복문(for, while) 사용은 금지!
같은 길이의 요소가 있다면 배열의 앞쪽에 있는 요소를 리턴!
배열에는 문자열 외에 다른 요소들이 있을 수 있음!
빈 배열을 입력받은 경우 -> 빈 문자열을 리턴!
주어진 배열에 문자열이 없는 경우 -> 빈 문자열을 리턴!
코드 작성
설명
function findShortestWord(arr) {
let newArr = arr.filter((el) => {
return typeof el === "string";
}); // 배열에 문자열 외에 다른 요소들이 있을 수 있다 했으므로, typeof el === 'string'인 요소들만 빼온다.
if (newArr.length === 0) {
return ""; // 위에서 string 인 요소들만 빼오면 만약 string타입의 요소가 없는 배열이었다면 newArr = []이므로 빈배열을 입력받았을때 모조리 '' 빈문자열로 먼저 리턴해놓는다. 이렇게하면 아래에 reduce()함수에서 initialValue값을 제공하지 않아도 에러가 나지않는다. (이유 : initialValue의 값을 제공하지않을때 빈배열이 들어오면 에러가 나옴!)
}
let result = newArr.reduce((acc, cur) => {
if (acc.length > cur.length) { // 길이 비교하여 누적값(초기값)을 리턴할지 현재 처리할 요소를 리턴할지 적어넣는다.
return cur;
} else {
return acc;
}
});
return result;
}
문제 31 번.
학생의 정보가 담긴 객체를 요소로 갖는 배열을 입력받아 아래 조건에 맞게 변형된 배열을 리턴하라!
남학생들의 정보는 리턴하는 배열에서 제외한다.
'grades' 속성값은 평균값(number 타입)으로 바꾼다.
인자 1 : students -> 객체를 요소로 갖는 배열
arr[i]는 'name', 'gender' 등의 속성을 갖는 객체
'grades' 속성은 number 타입을 요소로 갖는 배열
'grades' 속성이 빈 배열인 경우는 없다고 가정.
출력 ->
반복문(for, while) 사용은 금지!
배열을 리턴해야함.
배열로 되어 있는 학생들의 성적을 number 타입의 평균값으로 변형해야 한다.
-주의 사항-
'female'는 여학생, 'male'는 남학생이다.
코드 작성
설명
function studentReports(students) {
let newArr = students.filter((el) => {
return el.gender !== 'male';
}) // 여학생정보 객체인 요소로만 이루어진 배열
let result = newArr.map((el) => { // map으로 나열
let grade = el['grades'].reduce((acc,cur) => {
return acc + cur;
}) // grade라는 변수에 현재 map으로 나온 el의 grades속성값을 다 더함
let resultGrades = grade / el['grades'].length; // 전부다 더한 grade의 평균값을 구함
el['grades'] = resultGrades; // el의 grades속성값을 덮어씌워줌
return el; // map함수로 마지막에 el 리턴!
})
return result; // 최종 결과 result 리턴!
}
문제 32 번.
2차원 배열(배열을 요소로 갖는 배열)을 입력받아 모든 수(number)의 합을 리턴하라!
인자 1 : arr -> 배열을 요소로 갖는 배열
arr[i]는 임의의 타입을 요소로 갖는 배열
출력
number 타입을 리턴해야함.
-주의 사항-
합을 구할 때 number 타입만 고려해야함.
코드 작성
2가지 방법으로 풀었다.
주의사항에 for반복문 사용금지라는 말이 없었기에 두가지 방법으로 풀어볼수 있었다.
설명
// 1.
function sumOfArraysInArray(arr) {
let newArr = arr.reduce((a,b) => {
return a.concat(b);
}) // reduce()와 concat() 매서드를 사용하여 arr의 요소들 즉 배열들을 합쳐주었다.
let result = newArr.filter((el) => {
return el !== NaN && typeof el === 'number'; // 합쳐진 배열의 요소들이 NaN이 아니고 number타입인 요소들만 빼온다.
}).reduce((a,b) => {
return a + b;
}, 0) // initialValue를 0으로 두고, 각 요소들을 더해준다.
return result;
}
<------------------------------->
// 2.
function sumOfArraysInArray(arr) {
let result = 0; // result라는 변수 선언해둔다. 나중에 각요소들의 합을 더한 값들이 공중에 붕 떠있는 상태라 넣어줘야함.
for(let i = 0; i < arr.length; i++){ // 배열들을 합치지 않고, 배열안의 배열이므로 arr[i]하면 i번째 요소의 배열에 접근할 수 있다.
let numArr = arr[i].filter((el) => {
return el !== NaN && typeof el === 'number'; // el이 NaN이 아니면서 number타입인경우의 요소들을 빼온다.
}).reduce((a,b) => {
return a + b;
}, 0) // initialValue를 0으로 둔다. -> 빈배열이 오면 에러발생이 나지않고, 빈 배열이오거나 undefined가 오면 더해야할때 0으로 초기값을 줘야한다.
result += numArr; // 그리고 result에 += 로 numArr을 더해준다. numArr은 각 arr[i]의 요소들의 합이므로!
}
return result;
}
Author And Source
이 문제에 관하여(문제 -고차함수-), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hyo123/문제-고차함수-저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)