베스트앨범(프로그래머스-해시)

권 해·2023년 3월 20일
0

Algorithm

목록 보기
39/49

문제

코드

import java.util.*;
class Solution {
    public int[] solution(String[] genres, int[] plays) {
        Map<String,Integer> map=new HashMap<>();
        List<Genre> arr=new ArrayList<>();
        List<Integer> result=new ArrayList<>();
        
        for(int i=0;i<genres.length;i++)
            map.put(genres[i],map.getOrDefault(genres[i],0)+plays[i]);
        for(String s:map.keySet())
            arr.add(new Genre(s,map.get(s)));
        Collections.sort(arr,(a,b)->b.plays-a.plays);
        for(Genre g:arr){
            List<Play> play=new ArrayList<>();
            for(int i=0;i<genres.length;i++){
                if(genres[i].equals(g.genre)) play.add(new Play(i,plays[i]));
            }
            Collections.sort(play,(a,b)->b.play-a.play);
            for(int i=0;i<2;i++){
                if(play.size()==1){
                    result.add(play.get(i).index);
                    break;
                }
                result.add(play.get(i).index);
            }
        }
        int[] answer = new int[result.size()];
        for(int i=0;i<result.size();i++) answer[i]=result.get(i);
        return answer;
    }
}
class Genre{
    String genre;
    int plays;
    Genre(String genre,int plays){
        this.genre=genre;
        this.plays=plays;
    }
}
class Play{
    int index;
    int play;
    Play(int index,int play){
        this.index=index;
        this.play=play;
    }
}

풀이

어렵게 생각할 것이 없다. 의식의 흐름대로 구현해주면 된다.
(1) 먼저, 가장 많이 재생된 순서대로 장르를 나열해야 한다.

  • Genre 클래스를 구현하여 준다.(멤버변수로는 장르이름과 재생횟수가 있다.)
  • Genre형 ArrayList(arr)를 생성하여 준다.
  • 배열을 돌면서 해시맵을 통해 장르 별 재생횟수를 저장하여 준다.
  • 맵의 요소들을 돌면서 장르와 재생횟수를 통해 Genre 클래스를 생성하여 arr에 넣어준다.
  • arr을 재생 횟수에 따라 내림차순 정렬한다.

(2) arr을 앞에서부터 확인한다.(재생횟수가 많은 장르 순으로 정렬되어 있음)

  • Play 클래스를 구현하여 준다.(멤버 변수로는 고유번호와 재생횟수가 있다.)
  • Play형 ArrayList(play)를 생성하여 준다.
  • genres 배열을 돌면서 현재 확인하는 장르와 같으면, Play 객체를 생성하여 play에 넣어준다.
  • genres 배열을 다 돌았다면, play를 재생횟수 순으로 내림차수 정렬한다.
  • 정렬된 play에서 앞에 두개를 result(ArrayList)에 넣어준다.(만약 play의 사이즈가 하나라면, 하나만 넣는다.)

(3) 위 과정을 반복한 후, result의 요소들을 answer 배열에 옮겨담고 반환한다.

결과


뭔가 더 간단하게 풀 수 있는 방법이 있을 것 같아서 좀 오래 고민해봤는데, 이게 최선인 것 같다. 그냥 문제에서 하라는대로 순서대로 하면 된다.
3레벨 문제치고 어렵지 않은 문제였다.

출처 : 프로그래머스 코딩 테스트 연습 https://school.programmers.co.kr/learn/challenges

0개의 댓글

관련 채용 정보