SIU
article thumbnail

문제 유형 : 해쉬, 객체

https://school.programmers.co.kr/learn/courses/13213/lessons/91081

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 풀이 과정

1. 우선 장르별로 총 재생횟수의 합을 저장해놓은 후, 재생 횟수별로 내림차순 정렬을 해놓는 과정이 필요하다. ex) [{pop:3100},{classic:1450}]과 같은 형태

2. 고유번호, 장르, 재생횟수가 한데에 모아져있는 객체가 필요하다.

[
  { genre: 'classic', index: 0, playCnt: 500 },
  { genre: 'pop', index: 1, playCnt: 600 },
  { genre: 'classic', index: 2, playCnt: 150 },
  { genre: 'classic', index: 3, playCnt: 800 },
  { genre: 'pop', index: 4, playCnt: 2500 }
]

 

3. 2번 배열에서 1번 배열 객체의 키값에 해당하는 장르들을 배열에 따로 저장해서 재생횟수 별로 내림차순 정렬을 한 후, 상위 두개 원소의 고유번호만 뽑아서 answer 배열에 push 해준다.

 

핵심 Point

- 배열을 조작하여 Json 객체 만드는 방법

- {}를 ()로 감싸야 한다. (주의)

 

 

전체 코드

function solution(genres, plays) {
    // 1. 장르별 노래 재생 횟수 총 합 객체
    let playCntByGenre = {}
    for(let i = 0; i < genres.length; i++){
        // 해당 키가 없으면 처음엔 undefiend
        // 해당 키가 있다면 value 값을 증가시키고 없으면 새로운 키와 값을 넣는다
        //playCntByGenre[genres[i]] ? playCntByGenre[genres[i]]+=plays[i] : playCntByGenre[genres[i]] = plays[i]
         playCntByGenre[genres[i]] = playCntByGenre[genres[i]] ? playCntByGenre[genres[i]]+plays[i] : plays[i]
    }
    //console.log(playCntByGenre) // { classic: 1450, pop: 3100 }
   
    
    // 2. 재생 수에따른 내림차순 정렬
     let keyValueArr=Object.entries(playCntByGenre);
     keyValueArr.sort((a,b) => b[1]-a[1]); 
     //console.log(keyValueArr) // [ [ 'pop', 3100 ], [ 'classic', 1450 ] ]
    
    
    // 3. 종합 관리 객체 (index, genres, plays) join 과정 ? 괄호 2개
    const allInfo = genres.map((g,idx) => ({
        genre: g,
        index: idx,
        playCnt: plays[idx]
    }))
    // console.log(allInfo);
    
    // 4. 상위 재생 2개만 push
    let answer = [];
    keyValueArr.forEach( k =>{
        let fake = [];
        for(let j = 0; j<allInfo.length; j++){
            if(k[0] === allInfo[j].genre){
                fake.push(allInfo[j]);
            }
        }
        fake.sort((a,b) => b.playCnt - a.playCnt);
        // fake.forEach((c,i) =>{
        //     if(i<2) answer.push(c.index)
        //     else return false; // 최적화 탈출
        // })
        fake.slice(0,2).map((it,idx) => answer.push(it.index))
            
    }) // 해당 장르 종료
      
    return answer
}
profile

SIU

@웹 개발자 SIU

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!