3차원 배열, 키 값 쌍의 목록의 배열을 객체로 바꾸기 [알고리즘 문제]

양찌·2021년 5월 10일
1

JS

목록 보기
5/11
post-thumbnail
post-custom-banner

< 문제 >
배열을 받아서 나이를 오름차순으로 정렬을 하고, 각 개인의 퍼스트네임과 라스트네임을 요소로 하는 배열을 리턴한다.

<입력>
인자1: arr

  • 배열을 요소로 갖는 배열
  • arr[i].length는 2이다

<주의사항>

  • firstName 이나 lastName만 있을 경우 존재하는 그 값만 리턴한다.
let peopleList = [
    [
     ['firstName', '비'],
     ['age', 17],
     ['job', 'singer']
    ],
    [
     ['firstName', '이'],
     ['lastName', '효리'],
     ['age', 22],
     ['job', 'singer'],
    ],
    [
     ['lastName', '재석'],
     ['age', 27],
     ['job', 'comedian']
    ],
];

입출력 예시

let output = result(peopleList);
console.log(output()); // -> ['비', '이효리', '재석']



문제를 풀면서 알게된 새로운 사실들

  1. map을 활용하여 배열을 객체로 만들 수 있다.
  2. reduce는 map처럼 활용도 가능하다
  3. Object.fromEntries()
  4. Array.prototype.findIndex()

우선 위의 문제를 풀기 위해서 나는 가장 안에 있는 배열을 객체로 만들어야 한다고 생각했다. 그래서 map함수를 활용하여 객체로 만들었다.

1. map 함수로 배열을 객체로 만들기

const arr = [[[1,2]],[[3,4]],[[5,6]]];
const transformedArr = arr.map(function(ar){
	return ar.map(function(a){
    	let obj = {};
      	for(let i = 0; i < 1; i++){
        	obj[a[0]] = a[1];
        };
      	return obj;
    });
}) 

console.log(transformedArr) // [[{1:2}],[{3:4}],[{5:6}]]

오호라!!!😃 드디어 배열을 객체로 만들기 성공! 그래서 나는 나이를 정렬하면 되겠구나하고 다음 단계에 넘어갔다. sort 함수를 사용해서 객체를 정렬하는 방법을 이용해서 풀려고 했다. 하지만 정렬이 되지 않았다.
계속 해보았지만 되지 않았다.....😭

그 원인은 한 배열 안에 있는 객체들은 다른 키를 가지고 있기 때문에 정렬이 되지 않았던 것이였다. 그래서 나는 한 배열 안에 있는 각 객체들을 합칠 생각을 하였다...
뭔가 문제가 산으로 가고 있는 느낌이였다.


2. reduce 함수의 활용

Array.prototype.reduce()


결국 3일 만에 답을 찾을 수 있었는데, 푼 것은 아니고 인터넷에 동일한 문제가 있어 해답을 보았다. 정답에는 내가 그동안 풀면서 필요했던, 내가 알지 못한 새로운 함수들이 있었다.

  • Object.fromEntries()
  • Array.prototype.findIndex()
    아.. 공부 열심히 해야겠다.
    ⭐그리고 Array 메소드Object 메소드들 좀 공부 좀 해야겠다!⭐


3. Object.fromEntries()

이 메소드는 어떤 배열이 키와 값을 쌍의 목록을 가지고 있다면 객체로 바꿔주는 메소드이다.
이를테면 다음과 같다.

const keyValArr = [ ['name','루씨'], ['age',17], ['city','NewYork'] ];
const obj = Object.fromEntries(keyValArr);
console.log(obj); // {name: "루씨", age: 17, city: "NewYork"}



4. findIndex()

Array.prototype.findIndex()




👉 문제풀이

  1. 나이 순으로 정렬된 배열을 객체로 만든다.(Object.fromEntries()__ 다만 주어진 변수 peopleList는 삼차원 배열이기 때문에 한 단계들어가기 map함수 사용)
  1. 나이 순으로 정렬하기 (sort 함수 사용)
let compare = (a,b) => a.age - b.age;

function sortList(arr){
  
  // map메소드사용 - arr를 받아 2번째 arr와 3번째 arr를 오브젝트로 만든다.
  const changeToObj = arr.map(el => Object.fromEntries(el));
  
  // sort메소드사용 - 나이를 오름차순으로 정렬한다.
  return changeToObj.sort(compare);
}

const objListArr = sortList(peopleList);
  1. 2번의 결과 값으로 조건에 맞춰 이름을 새 배열에 push한다.
    • 경우1: firstName과 lastName 둘 다 있는 경우
    • 경우2: firstName만 있는 경우
    • 경우3: lastName만 있는 경우
function nameList(arr) {
  let result = [];
	for(let i = 0; i < arr.length; i++) {
      const firName = arr[i].firstName; // firstName의 값을 변수로 할당
 	  const lastName = arr[i].lastName; // lastName의 값을 변수로 할당
      
      if(firName && lastName) { 
      	result.push(firName+lastName);
      } else if(firName) { 
      	result.push(firName);
      } else if (lastName) { 
      	result.push(lastName);
      }
    }
  
  return result;
}

console.log(nameList(objListArr1)) //  ["비", "이효리", "재석"]



문제를 풀면서 느낀점

시험이 끝나고 3일동안 여러 방법을 사용해가면서 이 문제를 풀려고 하였다. 결국 이 문제와 동일한 문제를 인터넷에서 찾게 되었다. 내가 답을 보고 느낀점은 내가 아는 방법 말고 새로운 방법을 알아보는 스킬도 지녀야겠다는 것이다.

모르는 문제를 풀기 위해 나름 여러 방법을 써왔다. 그리고 그 안에서 새롭게 안 사실도 많아 포스팅이 길었다. 비록 내가 해결한 문제는 아니지만 포기하지 않고 해결법을 찾아낸 나 자신에게 박수.😃 짝짝짝!

profile
신입 개발자 입니다! 혹시 제 글에서 수정이 필요하거나, 개선될 부분이 있으면 자유롭게 댓글 달아주세요😊
post-custom-banner

0개의 댓글