본문 바로가기

Algorithm/프로그래머스

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

https://programmers.co.kr/learn/courses/30/lessons/42579

 

코딩테스트 연습 - 베스트앨범

스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가 ��

programmers.co.kr

import java.util.*;

class Solution {
    public int[] solution(String[] genres, int[] plays) {

        HashMap<String, Integer> g1 = new HashMap<>();

        for (int i = 0; i < genres.length; i++) {
            g1.put(genres[i], g1.getOrDefault(genres[i], 0) + plays[i]);
        }

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

        g1.forEach((k, v) -> g2.put(v, k));

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

        // 여기 for문에서는 가장 많이 나오는 장르부터 돈다
        for (var genre : g2.values()) {
            ArrayList<Integer> temp = new ArrayList<>();    // 장르에 해당하는 곡 번호가 담김
            for (int i = 0; i < genres.length; i++) {
                if (!genres[i].equals(genre)) continue;

                temp.add(i);
            }

            Collections.sort(temp, new Comparator<Integer>() {
                @Override
                public int compare(Integer o1, Integer o2) {
                    if (plays[o1] == plays[o2]) {
                        return Integer.compare(o1, o2);
                    }
                    else {
                        return Integer.compare(plays[o2], plays[o1]);
                    }
                }
            });
            answer2.add(temp.get(0));
            if (temp.size() > 1) {
                answer2.add(temp.get(1));
            }
        }

        int[] answer = new int[answer2.size()];
        for (int i = 0; i < answer2.size(); i++) {
            answer[i] = answer2.get(i);
        }

        return answer;
    }
}

 

C++은 return 형식이 vector라서 그냥 vector에 때려넣고 return하면 되는 반면

자바는 return 형식이 배열이라서 ArrayList를 쓰면 나중에 배열로 변환시켜줘야 한다

이거 C++에 너무 유리한거 아닌가 ㅋㅋㅋㅋ

 

새로 알게된거

  • HashMap의 foreach
  • ArrayList 정렬시키는거 Collections.sort() (배열은 Arrays.sort())
  • comparator