문제 -고차함수-

hyo·2021년 11월 30일
0

고차함수 문제

문제 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;
}
profile
개발 재밌다

0개의 댓글