본문 바로가기

알고리즘/문제풀이

프로그래머스 - 베스트앨범 (Java) 풀이 및 코드

 

https://school.programmers.co.kr/learn/courses/30/lessons/42579?language=java

 

프로그래머스

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

programmers.co.kr

위의 링크로 문제 설명은 생략.

 

풀이: 

주어진 String[] genres, int[] plays 배열들이 있다.

String [] genres = { "classic", "pop", "classic", "classic", "pop"};
int [] plays= {500, 600, 150, 800, 2500};

 

이 문제의 정답을 구하기 위해 필요한것은 크게 2 가지이다.

1.  장르별 총 재생수를 조회수 높은 장르부터 내림차순 되어야 함

2.  각 장르당 재생수대로 최대 2곡까지 수록, 한곡이면 한곡만 수록

 

 

1번을 구하려면 이런 구조의 자료형을 만들어야 한다.

2번을 구하려면 이런 구조의 자료형을 만들어야 한다.

 

전체코드
import java.util.*;
public class Main {
        public int[] solution(String [] genres, int [] plays){
            ArrayList<Integer> answer = new ArrayList<>();
            //장르와 장르의 재생 수
            HashMap<String,Integer> total = new HashMap<>();
            //각 장르와 각 장르의 해당하는 곡번호,곡 조회수
            HashMap<String,HashMap<Integer,Integer>> all_gen = new HashMap<>();
            for(int i=0;i<genres.length;i++){
                total.put(genres[i], total.getOrDefault(genres[i],0)+plays[i]);
                //핵심코드 : 장르의 상세 조회수 put
                HashMap<Integer, Integer> map = all_gen.getOrDefault(genres[i], new HashMap<>());
                map.put(i, plays[i]);
                all_gen.put(genres[i],map);
            }
            //핵심코드 : total 전체조회수(value)대로 내림차순 정렬
            ArrayList<String> total_Keys = new ArrayList<>(total.keySet());
            Collections.sort(total_Keys, (v1, v2) -> (total.get(v2)-total.get(v1)));
            //핵심코드 : 장르의 포함된 곡들의 조회수별 내림차순 정렬 및 answer에 add
            for(String key:total_Keys){
                HashMap<Integer,Integer> map = all_gen.get(key);
                ArrayList<Integer> detail_Keys = new ArrayList<>(map.keySet());
                Collections.sort(detail_Keys, (v1,v2)->map.get(v2)-map.get(v1));
                answer.add(detail_Keys.get(0));
                if(detail_Keys.size()>1) answer.add(detail_Keys.get(1));
            }
            //배열로 리턴
            return answer.stream().mapToInt(i -> i).toArray();
        }

    public static void main(String[] args) {
        Main M = new Main();
        Scanner kb = new Scanner(System.in);
        String [] genres = { "classic", "pop", "classic", "classic", "pop"};
        int [] plays= {500, 600, 150, 800, 2500};
        System.out.println(Arrays.toString(M.solution(genres,plays)));
    }
}

 

 

 

후기: Hash로 분류된 문제였지만 정렬 알고리즘이 주가 된 느낌이었고, class형에서의 정렬만 주로 했었는데 

아래와 같은 방식도 익힐 수 있어서 좋았다

ArrayList<String> total_Keys = new ArrayList<>(total.keySet());
Collections.sort(total_Keys, (v1, v2) -> (total.get(v2)-total.get(v1)));