코딩테스트 연습 - 베스트앨범 | 프로그래머스 스쿨 (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) |
[프로그래머스] 줄 서는 방법 (0) | 2023.08.08 |
---|---|
[프로그래머스] 전력망을 둘로 나누기 (0) | 2023.08.08 |
[프로그래머스] 문자열 내 마음대로 정렬하기 (0) | 2023.08.08 |