배열 순회하여 객체로 정리하기

Song Haeun·2023년 7월 31일
0
프로그래머스 LV2 귤 고르기

// *객체를 만들어 크기별 귤 갯수 정리하기
// *해당 숫자가 없으면 key 만들고 value는 1
// *해당 숫자가 있으면 해당 value +1
//객체가 완성되면 키값은 무시하고 value만으로 이루어진 배열 재생성(내림차순 정렬)
// 가장 큰 value부터(앞에서부터) k에서 뺀다. type++ 
// k가 0 이하가 되면 return type

위의 과정으로 알고리즘 문제를 해결했다.
*부분을 위해 배열을 순회하여 객체로 정리하는 로직이 필요했다.

forEach 사용하기

 tangerine.forEach((size)=>{
     if(tangObj[size])tangObj[size]++
     else tangObj[size] = 1;
 })

나는 forEach를 이용해 tangerine이라는 배열을 순회해 tangObj를 생성했다.
1.tangObj에 해당 요소 키가 이미 존재한다면 키에 해당하는 값에 1을 더한다.
2. 존재하지 않는다면 값을 1로 하여 생성한다.

다른 방법

다른 사람의 풀이를 참고하여 다른 방법으로도 풀어보았다.

1. for of 반복문 사용하기
2. reduce 메서드만 사용하기

for of 반복문

for (const value of tangerine) {
tangObj[value] = (tangObj[value] || 0) + 1;
}

foeEach와 거의 비슷한 방법이다.
추가로 || 논리연산자를 사용하여 if/else 없이 간결하게 코드를 작성할 수 있었다.

reduce 메서드

const tangObj = tangerine.reduce((acc, value) => {
acc[value] = (acc[value] || 0) + 1;
return acc;
}, {});
  1. reduce 메서드의 두 인자를 콜백 함수와 초기 누적 값으로 설정한다.

  2. 콜백 함수는 각 배열 요소를 객체의 키로 가지는 프로퍼티를 생성한다.

  3. 콜백 함수는 누적 객체에 해당 요소 키가 이미 존재하는지 확인하고, 존재하면 해당 값에 1을 더한다. 존재하지 않으면 값을 1로 초기화한다.

  4. 누적 객체(tangObj)를 반환한다.

    귤 고르기 전체 코드

     function solution(k, tangerine) {
     let type = 1;
     let tangObj = {};
     
     tangerine.forEach((num)=>{
         if(tangObj[num])tangObj[num]++
         else tangObj[num] = 1;
     })
     const tangValue = Object.values(tangObj).sort((a, b) => b - a);
     tangValue.forEach((num)=>{
             k -= num;
         
         if(k-num <=0){
             return;
         } 
         else {
             type++; 
              }
     })
     return type;
    }```
profile
프론트엔드 개발하는 송하은입니다🐣

1개의 댓글

comment-user-thumbnail
2023년 7월 31일

잘 봤습니다. 좋은 글 감사합니다.

답글 달기