상세 컨텐츠

본문 제목

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

코딩테스트 연습

by 박집실 2023. 8. 8. 01:00

본문

코딩테스트 연습 - 베스트앨범 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

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

programmers.co.kr

정리 : HashMap를 많이 사용해서 그것을 기반으로 푸는 문제. 코드가 길어져서 어려웠다.

 

import java.util.*;
class Solution {
    public int[] solution(String[] genres, int[] plays) {
        HashMap<String, Integer> hash = new HashMap<>();
        HashMap<Integer, String> hash2 = new HashMap<>();
        HashMap<String, HashMap> hash3 = new HashMap<>();
        Queue queue = new LinkedList();
        for(int i = 0; i < genres.length; i++) {
            hash.put(genres[i], hash.getOrDefault(genres[i], 0) + plays[i]);
            if(hash.get(genres[i]) == 0)
                hash.replace(genres[i], plays[i]);
        }
        int[] ans = new int[hash.size()];
        String[] key = new String[hash.size()];
        int idx = 0;
        for(String n : hash.keySet()) {
            int num = (int)hash.get(n);
            hash2.put(num, n);
            ans[idx++] = num;
        }
        Arrays.sort(ans);
        for(int i = hash.size() - 1, k = 0; i >= 0 || k < hash.size() ; i--) {
            key[k++] = hash2.get(ans[i]);
        }
        for(int i = 0; i < genres.length; i++) {
            hash3.put(genres[i], (hash3.getOrDefault(genres[i], new HashMap())));
            hash3.get(genres[i]).put(i, plays[i]);
        }

        idx = 0;
        for(String s : key) { 
            try{
            HashMap map = (HashMap)(hash3.get(s));
            HashMap map2 = new HashMap();
            int[] iarr = new int[map.size()];
            int l = 0;
            for(Object str : map.keySet()){
                iarr[l] = (int)map.get((int)str);
                map2.put(iarr[l], (int)str);
                l++;
            }
            Arrays.sort(iarr);
            if(iarr.length >= 2){
            if(iarr[iarr.length - 1] == iarr[iarr.length - 2]){
                int[] ch = {genres.length , genres.length};
                for(Object str : map.keySet()){
                    if(iarr[iarr.length - 1] == (int)map.get((int)str)){
                        int arb = ch[0];
                        int arb2 = ch[1];
                        ch[0] = Math.min(ch[0], (int)str);
                        if(arb != ch[0])
                            ch[1] = Math.min(arb, ch[1]);
                        else if((int)str < arb2)
                            ch[1] = (int) str;
                    }
                }
                for(int h : ch){
                    if(h == genres.length)
                        break;
                    queue.add(h);
                }
                continue;
            }
            if(iarr.length >= 3)
               if(iarr[iarr.length - 2] == iarr[iarr.length - 3]){
               int[] ch = {genres.length , genres.length};
               for(Object str : map.keySet()){
                    if(iarr[iarr.length - 2] == (int)map.get((int)str)){
                        int arb = ch[0];
                        int arb2 = ch[1];
                        ch[0] = Math.min(ch[0], (int)str);
                        if(arb != ch[0])
                            ch[1] = Math.min(arb, ch[1]);
                        else if((int)str < arb2)
                            ch[1] = (int) str;                        
                    }
                }
                queue.add((int)map2.get(iarr[iarr.length - 1]));
                queue.add(ch[0]);  
                continue;
            }
            }
            queue.add((int)map2.get(iarr[iarr.length - 1]));
            queue.add((int)map2.get(iarr[iarr.length - 2]));
            } catch(Exception e){continue;}
        }
        int[] answer = new int[queue.size()];
        while(!queue.isEmpty())
            answer[idx++] = (int)queue.poll();
        return answer;
    }
}
정확성 테스트
테스트 1 통과 (1.03ms, 82.5MB)
테스트 2 통과 (1.13ms, 76.5MB)
테스트 3 통과 (0.56ms, 72.5MB)
테스트 4 통과 (0.93ms, 83.2MB)
테스트 5 통과 (1.30ms, 87.1MB)
테스트 6 통과 (0.86ms, 74.6MB)
테스트 7 통과 (0.91ms, 67.7MB)
테스트 8 통과 (2.27ms, 75.1MB)
테스트 9 통과 (1.06ms, 74.8MB)
테스트 10 통과 (0.93ms, 77.5MB)
테스트 11 통과 (0.90ms, 67MB)
테스트 12 통과 (1.12ms, 77.7MB)
테스트 13 통과 (0.65ms, 73.3MB)
테스트 14 통과 (0.92ms, 73.4MB)
테스트 15 통과 (0.65ms, 74.4MB)
채점 결과
정확성: 100.0
합계: 100.0 / 100.0

관련글 더보기