문제

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

풀이

  1. 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
  2. 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
  3. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.

• 장르에 속한 곡이 하나라면, 하나의 곡만 선택합니다.

이 조건들을 위주로 생각하여 문제를 풀었다.

우선, 장르, 재생횟수, 인덱스를 저장하기 위해 Triple이라는 자료구조를 하나 만들어줬다.

또한, 장르별 재생횟수를 저장하기 위해 Pair 자료구조와 함께 HashMap을 사용했다.

Triple 자료구조를 저장하는 list에 모든 데이터를 담고, 이 후 재생횟수 순서대로 Triple을 정렬시켜줬다.

이후 이중 for문을 통해 장르별 최대 두개의 곡을 선택한다. 횟수가 2회가 되면 반복문을 종료하게 했다. 이로써 장르에 곡이 1개인 경우 해당 인덱스를 하나만 추가하게 된다.

list 자료구조에 담은 데이터를 배열로 변환하여 리턴하면 끝

코드

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;

class Solution {
         class Pair<T,V> {
        T first;
        V second;

        public Pair(T first, V second) {
            this.first = first;
            this.second = second;
        }
    }
    class Triple<T,K,V> {
        T first;
        K second;
        V third;

        public Triple(T first, K second, V third) {
            this.first = first;
            this.second = second;
            this.third = third;
        }
    }
    public int[] solution(String[] genres, int[] plays) {
        int[] answer = {};
        HashMap<String, Integer> map = new HashMap<>();
        ArrayList<Triple<Integer, String, Integer>> list = new ArrayList<>();
        ArrayList<Pair<String, Integer>> arrayList = new ArrayList<>();
        ArrayList<Integer> ans = new ArrayList<>();
        for (int i = 0; i < genres.length; i++) {
            map.put(genres[i], map.getOrDefault(genres[i], 0) + plays[i]);
            list.add(new Triple(i, genres[i], plays[i]));
        }
        map.forEach((s, i) -> {
            arrayList.add(new Pair(s,i));
        });
        Collections.sort(list, new Comparator<Triple<Integer, String, Integer>>() {
            @Override
            public int compare(Triple<Integer, String, Integer> o1,
                Triple<Integer, String, Integer> o2) {
                return o2.third - o1.third;
            }
        });

        Collections.sort(arrayList, new Comparator<Pair<String, Integer>>() {
            @Override
            public int compare(Pair<String, Integer> o1, Pair<String, Integer> o2) {
                return o2.second-o1.second;
            }
        });
        int idx = 0;
        for (int i = 0; i < arrayList.size(); i++) {
            String s = arrayList.get(i).first;
            int cnt = 0;
            for (int j = 0; j < list.size(); j++) {
                if (cnt == 2) break;
                if (list.get(j).second.equals(s)) {
                    ans.add(list.get(j).first);
                    cnt++;
                }
            }
        }
        answer = new int[ans.size()];
        for (int i = 0; i < ans.size(); i++) {
            answer[i] = ans.get(i);
        }
        return answer;
    }
}

+ Recent posts