Challenge

4-2 Challenge 요소를 모두 더한 배열에서 k 번지 값 찾기(flat과 flatMap)

kagan-draca 2024. 8. 27. 20:34

const ArrayAllAdd = array => {
  return array
    .reduce((acc, cur) => {
      // acc 누산 결과를 저장할 변수
      // cur 현재 요소
      return acc.flatMap(
        // flat과 map을 합친 기능으로
        // 평탄화된 배열을 반환하는 기능
        element => cur.map(element2 => element + element2),
        // 누산 값의 요소에서
        // 현재값(배열)의 요소를 더한 값이 더해진 배열을 생성
        [0]
        //acc 초기값
      );
    })
    .sort((a, b) => a - b)[k - 1];
  // 정렬 및 찾고자 하는 번지 수
};

let n = 3;
let m = 3;
let k = 4;
//배열 개수, 배열 길이, 몇 번째 숫자

let array = [
  [1, 4, 7],
  [2, 5],
  [3, 6],
];
let sum = ArrayAllAdd(array);
console.log(sum);

n = 4;
m = 2;
k = 7;

array = [
  [1, 10],
  [2, 3],
  [4, 5],
  [6, 7],
];
sum = ArrayAllAdd(array);
console.log(sum);

 

처음에는 각 배열을 무작정 반복문을 중첩시켜 다

더할려고 했다...

 

그런데 생성될 수 있는 배열의 개수도

무궁무진하고, 각 배열의 길이도 무궁무진한 상태라

다른 방법을 찾아봤다.

 

그 결과 reduce, flatMap, map을 사용하면 

반복 없이 모든 배열의 요소를 더한 배열을

만든 수 있었다.

 

reduce는 알고는 있지만 손이 잘 안 가는 함수라

다시 기능을 정리하면

 

reduce((acc,cur, 초기값)=>

{

})

으로 

 

acc는 누산된 결과

cur은 현재값

초기값은 : 초기 acc의 값

 

이다.

 

flatMap은 

flat과 map이 합쳐진 함수

 

flat(num(중첩된 배열 제거할 수))중첩된 배열을 평탄화 해주는 함수이다.

 

ex) let array = [1,[2,[3,[4,[5]]]]] 을 flat함수를 사용하면

array.flat()

 

[1,2,[3,[4,[5]]]]로 

[2,[3,[4,[5]]]]]이 2,[3,[4,[5]]]]으로 바뀌고

1과 붙여진 배열이 돼서

[1,2,[3,[4,[5]]]]이 된다.

 

만약,

 

array.flat(Infinate)를 주면

 

1,2,3,4,5로 배열을 완전히 제거할 수 있다.

 

따라서 flatMap은 중첩된 배열에서 배열을 제거한 후

map에서 조작한 새로운 배열을 리턴한다.

 

 

'Challenge' 카테고리의 다른 글

3-3 Challenge  (0) 2024.08.27
CMD 게임 만들기 4Days  (0) 2024.08.26
3-2 Challenge 배열에 1 최대 개수 구하기  (0) 2024.08.26
3-1 Challenge 두산이 안타를 몇 개 쳐야 이기는가?  (0) 2024.08.26
CMD 게임 만들기 3Days  (0) 2024.08.23