티스토리 뷰

 

프로그래머스

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

programmers.co.kr

문제 자체는 매우 쉽지만, java comparator를 연습하기 좋아 보여서 풀었다. 문제에서 하라는대로 하면 바로 뚫리는 문제다. 요구사항은 아래와 같다.

1. 수록곡이 많은 장르를 우선순위로 내림차순 정렬한다.

2. 수록곡을 기준으로 내림차순 정렬한다.

3. 초기 index 위치를 기준으로 오름차순 정렬한다.

이를 관리하기 위해 map 두개를 활용했다. 하나는 장르별로 수록곡이 총 몇개인지? 다른 하나는 장르별 초기 인덱스를 저장하는 map이다.
그다음, 구현만 하면 끝이다. 단 주의할점이 하나 있는데, 각 장르별 최대 2개의 곡만 선정할 수 있다는 점이다. 이 부분은 예제에 잘 나와있어서 금방 고칠 수 있었지만, 케이스가 약한 실제 코테였다면 놓쳤을것 같다. 문제를 꼼꼼히 읽자.

import java.util.*;

class Solution {
    
    private Map<String, Integer> genreCount = new HashMap<>();
    private Map<String, List<Integer>> genreMap = new HashMap<>();
    private List<Integer> playList = new ArrayList<>();
    
    public int[] solution(String[] genres, int[] plays) {
        for (int play : plays) playList.add(play);
        for (int i=0; i<genres.length; i++) {
            if (genreCount.get(genres[i]) == null) {
                genreCount.put(genres[i], 0);
                genreMap.put(genres[i], new ArrayList());
            }
            genreCount.put(genres[i], genreCount.get(genres[i]) + plays[i]);
            genreMap.get(genres[i]).add(i);
        }
                
        
        List<String> list = new ArrayList<>(genreCount.keySet());        
        Collections.sort(list, new GenreComparator());
        List<Integer> ans = new ArrayList<>();
        
        for(String key : list) {
            Collections.sort(genreMap.get(key), new CountComparator());
            int c = 0;
            for (Integer idx : genreMap.get(key)) {
                if(c == 2) break;
                c++;
                ans.add(idx);
            }
        }
        int[] answer = new int[ans.size()];
        for(int i=0; i<ans.size(); i++) {
            answer[i] = ans.get(i);
        }
        return answer;
    }
    
    class GenreComparator implements Comparator<String> {
        @Override
        public int compare(String a, String b) {
            return genreCount.get(b).compareTo(genreCount.get(a));
        }
    }
    
    class CountComparator implements Comparator<Integer> {
        @Override
        public int compare(Integer a, Integer b) {
            if (playList.get(a) == playList.get(b)) {
                return a.compareTo(b);
            }
            return playList.get(b).compareTo(playList.get(a));
        }
    }
}

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함