문제풀이_고차함수

future·2020년 12월 21일
0

문제풀이

목록 보기
5/6

#pipe

함수들을 입력받아 함수들이 입력된 차례대로 결합된 새로운 함수를 리턴해야 한다.

function pipe(...func) {
  return function(num) {
    let output = num;
    for (let i = 0; i < func.length; i++) {
      output = func[i](output);
    }
    return output;
  }
}

#getIndex

정수를 요소로 갖는 배열과 정수(num)를 입력받아 num을 배열에 추가하고 정렬한다고 가정할 경우, num의 인덱스를 리턴해야 한다.

입력받은 수 num을 주어진 배열 arr에 추가하고 '정렬'해줘야 한다.
예시) arr = [5, 4, 1, 3] , num = 2 / 추가 → [5, 4, 1, 3, 2] / 정렬 → [1, 2, 3, 4, 5]

function getIndex(arr, num) {
  let index = arr.filter(function(element) {
    return num > element;
  })
  return index.length;
}

#getElementsLessThan100AtProperty

객체와 키를 입력받아 키에 해당하는 값이 배열인 경우, 100 보다 작은 요소들만 갖는 배열을 리턴해야 한다.

  • 주어진 키에 해당하는 값이 배열이고, 100 미만인 요소가 있는 경우에만 해당 요소를 갖는 배열을 리턴
  • 그 외의 경우 빈 배열을 리턴
  • 주어진 보조 함수(lessThan100)를 사용
function lessThan100(number) {
  return number < 100;
}

function getElementsLessThan100AtProperty(obj, property) {

1. 새로운 배열 arr를 선언 후 객체의 키에 해당하는 값을 할당해준다.

  let arr = obj[property];

2. 키에 해당하는 값이 배열이고,
   배열에 있는 요소가 숫자이면서 100 미만일 경우를 필터링해준다.
   이때 보조함수 lessThan100을 이용하여 100 미만인지를 판단해준다.   
  
  if (Array.isArray(arr)) {
    return arr.filter(function(element) {
      return typeof element === 'number' && lessThan100(element);
    })
  } else {
    return [];
  }

3. 필터링해준 배열 arr를 최종 리턴해준다.

  return arr;
}

#getSquaredElementsAtProperty

객체와 키를 입력받아 키에 해당하는 값이 배열인 경우, 배열의 각 요소를 제곱한 새로운 배열을 리턴해야 한다.

  • 새로운 배열을 리턴
  • 주어진 키에 해당하는 값이 배열인 경우, 해당 배열은 number 타입의 정수만을 요소로 갖는다고 가정
  • 주어진 보조 함수(square)를 사용
function square(number) {
  return number * number;
}

function getSquaredElementsAtProperty(obj, property) {

1. 새로운 배열 arr를 선언 후 객체의 키에 해당하는 값을 할당해준다.

  let arr = obj[property];

2. 키에 해당하는 값이 배열일 경우 보조함수 square을 사용하여 요소를 제곱한 값을 리턴해준다.

3. 키에 해당하는 값이 배열이 아닌 경우에는 빈 배열을 리턴해준다.
  
  if (Array.isArray(arr) === true) {
    return arr.map(square);
  } else {
    return [];
  }
}

#getLengthOfLongestElement

문자열을 요소로 갖는 배열을 입력받아 배열에서 가장 긴 문자열의 길이를 리턴해야 한다.

  • number 타입을 리턴
  • 빈 배열을 입력받은 경우 0을 리턴
function getLengthOfLongestElement(arr) {

1. 먼저 빈 배열을 입력받은 경우에는 0을 리턴해준다.

  if (arr.length === 0) {
    return 0;
  }

2. 

  return arr.reduce(function(a, b) {
    if (a.length >= b.length) {
      return a;
    } else {
      return b;
    }
  }).length;
}

#findShortestWord

배열을 입력받아 배열에서 가장 짧은 길이를 가진 문자열 요소를 리턴해야 한다.

  • 같은 길이의 요소가 있다면 배열의 앞쪽에 있는 요소를 리턴
  • 배열에는 문자열 외에 다른 요소들이 있을 수 있음
  • 빈 배열을 입력받은 경우, 빈 문자열을 리턴
  • 주어진 배열에 문자열이 없는 경우, 빈 문자열을 리턴
function findShortestWord(arr) {

1. 빈 배열을 입력받은 경우 빈 문자열을 리턴해준다.

  if (arr.length === 0) {
    return '';
  }
  
2. 새로운 배열을 선언해주고, 원래 배열에서 문자열로만 구성되게 필터링해준다.
   이때 typeof를 사용하여 요소가 문자열인지 걸러주는 것이다.
   
  let newArr = arr.filter(function(element) {
    return typeof element === 'string';
  });
  
3. 만약 배열 newArr에 문자열이 없는 경우 빈 문자열을 리턴해준다.

  if (newArr.length === 0) {
    return '';
  }

4. reduce 메서드를 사용하여 각 요소(문자열)의 길이를 비교해준다.
   조건문을 사용하여 가장 짧은 길이를 가진 문자열을 리턴해준다.

  return newArr.reduce(function(a, b) {
    if (a.length <= b.length) {
      return a;
    } else {
      return b;
    }
  })
}

#studentReports

학생의 정보가 담긴 객체를 요소로 갖는 배열을 입력받아 아래 조건에 맞게 변형된 배열을 리턴해야 한다.

  • 남학생들의 정보는 리턴하는 배열에서 제외
  • 'grades' 속성값은 평균값(number 타입)으로 변경
  • 배열로 되어 있는 학생들의 성적을 number 타입의 평균값으로 변형
function studentReports(students) {

1. 변수 newStudents를 선언해주고, filter 메서드를 사용하여
   객체 속 gender의 value값이 'female'인 경우를 걸러준 후, 해당 객체를 할당해준다.

  let newStudents = students.filter(function(element) {
    return element.gender === 'female';
  })
  
2. grades의 속성값을 평균값으로 내줄 새로운 배열을 만들기 위해 map 메서드를 사용한다.

3. sum이라는 변수를 선언하고 grades 속성값을 합친 값(acc)을 할당해준다.

  return newStudents.map(function(element) {
    let sum = element.grades.reduce(function(acc, curr) {
      acc = acc + curr;
      return acc;
    })

4. grades 속성값을 더한 sum을 grades 수만큼 나눠준 뒤에 grades의 속성값에 재할당해준다.

5. 위 조건들에 맞추어 변경된 배열을 최종 리턴해준다.

    element.grades = sum / element.grades.length;
    return element;
  })
}

#sumOfArraysInArray

2차원 배열(배열을 요소로 갖는 배열)을 입력받아 모든 수(number)의 합을 리턴해야 한다.

  • number 타입을 리턴
1. arr = [[1, 2], [undefined, 4, '5'], [9, 'hello'],] 라고 예를 들어보려고 한다.

function sumOfArraysInArray(arr) {

2. 먼저 reduce와 concat 메서드를 통해 2차원 배열을 1차원 배열로 만들어준다.

let newArr = arr.reduce(function(acc, curr) {
  return acc.concat(curr);
});

// newArr = [1, 2, undefined, 4, '5', 9, 'hello']

3. 새 배열(filtering)을 선언해주고, filter 메서드를 이용하여
   1차원 배열(newArr)에서 number 타입 요소만 걸러준 값을 할당해준다.

let filtering = newArr.filter(function(element) {
  return typeof element === 'number';
});

// filtering = [1, 2, 4, 9]

4. 다시 reduce 메서드를 이용하여 필터링된 요소들끼리 더해준 뒤 그 축적값을 리턴해준다.

return filtering.reduce(function(acc, curr) {
  acc = acc + curr;
  return acc;
}, 0);

}
profile
get, set, go!

0개의 댓글