프로그래머스 - 베스트앨범[java]

스브코·2021년 11월 11일

문제출처: https://programmers.co.kr/learn/courses/30/lessons/42579

문제 설명

입력 값(장르)

["classic", "pop", "classic", "classic", "pop"]

입력 값(장르별 재생횟수)

[500, 600, 150, 800, 2500]

출력값

[4, 1, 3, 0]

위 입력값을 정리해보면
classic = 500, 150, 800 (sum = 1450)
pop = 2500, 600 (sum = 3100)

이렇게 총 재생 횟수가 제일 많은 장르의 노래 중 재생횟수가 제일 많은 것 두개 씩 순서 대로 '입력 값(장르별 재생횟수)'의 index를 출력(최대 2개씩)

문제 풀이

import java.util.*;

class Solution {
    public ArrayList<Integer> solution(String[] genres, int[] plays) {

        HashMap<String, ArrayList<Integer>> hm = new HashMap<>();

        for(int i = 0; i <genres.length; i++) {
            if(hm.containsKey(genres[i])) {
                hm.get(genres[i]).add(plays[i]);
            } else {
                ArrayList<Integer> playsByGenre = new ArrayList<>();
                playsByGenre.add(plays[i]);
                hm.put(genres[i], playsByGenre);
            }
        }

        TreeMap<Integer, String> tm = new TreeMap<>(Collections.reverseOrder());

        for(String key : hm.keySet()) {
            Collections.sort(hm.get(key));
            Collections.reverse(hm.get(key));
            int count = 0;
            for(int play : hm.get(key))
                count += play;
            tm.put(count, key);
        }

        ArrayList<Integer> answer = new ArrayList<Integer>();

        for(int key : tm.keySet()) {
            int playTemp = hm.get(tm.get(key)).get(0);
            String genreTemp = tm.get(key); 
            boolean [] added = new boolean [plays.length];
            for(int i = 0; i < plays.length; i++) {
                if(plays[i] == playTemp && genres[i].equals(genreTemp)) {
                    answer.add(i);
                    added[i] = true;
                    break;
                }
            }
            if(hm.get(tm.get(key)).size() > 1) {
                int playTemp2 = hm.get(tm.get(key)).get(1);
                for(int i = 0; i < plays.length; i++) {
                    if(plays[i] == playTemp2 && genres[i].equals(genreTemp) && !added[i]) {
                        answer.add(i);
                    }
                }
            }
        }   
        return answer;
    }
}

입력 예시를 이용해서 설명하자면,

HashMap으로

classic ={ 500, 150, 800 }
pop = {600, 2500}

다시 트리맵으로 각 장르의 재생횟수를 키로 (descending으로함)

TreeMap<Integer, String> tm = new TreeMap<>(Collections.reverseOrder());

3100 = pop
1450 = classic

그러면서 동시에 Hashmap을 descending으로 sort

classic ={ 800, 500, 150 }
pop = {2500, 600}

원래 입력값 + HashMap + TreeMap을 이용하여 index를 찾아서 출력

1차 제출 (실패 8개)

디버깅을 해보니 HashMap에 장르별로 재생횟수의 노래가 1개씩만 있을 수 도 있는 경우가 포함이 안됨

수정 후 2차 제출(실패 2개)

질문하기를 확인하니 장르별 총 재생횟수가 같은 경우는 없으나 장르의 노래별 재생횟수는 같은 경우가 있기때문에 그런 경우는 오름차 순으로 출력을 해주어야함. 내 코드의 경우에는 똑같은 index를 두번 씩 출력하고 있었음.

ex) classic = {300, 200,200, 100} 이면 {1, 2} 가 출력이 되어야 하는데 내코드는 {1, 1}을 출력하고 있었음.

수저 후 3차 제출 (통과)

profile
익히는 속도가 까먹는 속도를 추월하는 그날까지...

0개의 댓글