개발 일기장
[프로그래머스] 해쉬-베스트 엘범 문제 본문
package ysy;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
public class Ysy4 {
public static int[] solution(String[] genres, int[] plays) {
int flag = 0; // 장르에 속한 음악이 하나일경우, 초기화할 배열숫자 -1줄여야함, 그때 쓰임
// map : 장르에 속하는 ArrayList(인덱스 순서)를 넣음
HashMap<String, ArrayList<Integer>> map = new HashMap<String, ArrayList<Integer>>();
// map2 : key값은 장르명, value값은 장르명에 모든 스트리밍을 더한 횟수를 넣을예정
HashMap<String, Integer> map2 = new HashMap<String, Integer>();
// map에 장르명에 속하는 모든 인덱스 순서를 넣음
for (int i = 0; i < genres.length; i++) {
if (map.get(genres[i]) == null) {
ArrayList<Integer> a = new ArrayList<Integer>();
a.add(i);
map.put(genres[i], a);
} else {
ArrayList<Integer> temp;
temp = map.get(genres[i]);
temp.add(i);
}
map2.put(genres[i], map2.getOrDefault(genres[i], 0) + plays[i]);
}
// map("장르명", ArrayList에 조회수별 인덱스 순서를 sort)
Set<String> set = map.keySet();
Iterator<String> it = set.iterator();
while (it.hasNext()) {
ArrayList<Integer> a = map.get(it.next());
a.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
if (plays[o1] > plays[o2]) {
return -1;
} else if (plays[o1] < plays[o2]) {
return 1;
} else {
return 0;
}
}
});
// 장르가 속한 노래가 하나일 경우 flag 증가
if (a.size() < 2) {
flag++;
}
}
ArrayList<String> songlist = new ArrayList<String>();
Set<String> set2 = map2.keySet();
Iterator<String> it2 = set2.iterator();
// 장르별 전체 조회수 ArrayList만들기
while (it2.hasNext()) {
songlist.add(it2.next());
}
// 장르별 전체 조회수 sort
songlist.sort(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if (map2.get(o1) > map2.get(o2)) {
return -1;
} else if (map2.get(o1) < map2.get(o2)) {
return 1;
} else {
return 0;
}
}
});
int[] answer = new int[map2.size() * 2 - flag];
int i = 0;
for (String a : songlist) {
ArrayList<Integer> q = map.get(a);
if (q.size() > 1) {
if (plays[q.get(0)] == plays[q.get(1)]) {
if (q.get(0) > q.get(1)) {
answer[i++] = q.get(1);
answer[i++] = q.get(0);
} else {
answer[i++] = q.get(0);
answer[i++] = q.get(1);
}
} else {
answer[i++] = q.get(0);
answer[i++] = q.get(1);
}
} else if (q.size() == 1) {
answer[i++] = q.get(0);
}
}
return answer;
}
public static void main(String[] args) {
int[] plays = { 500, 600, 150, 800, 2500, 400, 400, 10, 20 };
String[] genres = { "classic", "pop", "classic", "classic", "pop", "ysy", "ysy", "aa", "b" };
int[] a = solution(genres, plays);
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
}
}
저는 이 방법으로 풀었습니다. 혹시 참고하실분은 참고하세요!(코드가 약간 야매식인거 같긴한데;)
ArrayList의 sort메소드에 대해서 좀더 알게되었던 예제인듯싶습니다.
여기 블로그에서 좀더 sort에 대해서 자세하게 알 수 있는듯.. 참고할만함
https://manorgass.tistory.com/60
import java.util.HashMap;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Map;
import java.util.Collections;
class Solution {
public int[] solution(String[] genres, int[] plays) {
HashMap<String, Object> genresMap = new HashMap<String, Object>(); //<장르, 곡 정보>
HashMap<String, Integer> playMap = new HashMap<String, Integer>(); //<장르, 총 장르 재생수>
ArrayList<Integer> resultAL = new ArrayList<Integer>();
for(int i = 0; i < genres.length; i++){
String key = genres[i];
HashMap<Integer, Integer> infoMap; // 곡 정보 : <곡 고유번호, 재생횟수>
if(genresMap.containsKey(key)){
infoMap = (HashMap<Integer, Integer>)genresMap.get(key);
}
else {
infoMap = new HashMap<Integer, Integer>();
}
infoMap.put(i, plays[i]);
genresMap.put(key, infoMap);
//재생수
if(playMap.containsKey(key)){
playMap.put(key, playMap.get(key) + plays[i]);
}
else {
playMap.put(key, plays[i]);
}
}
int mCnt = 0;
Iterator it = sortByValue(playMap).iterator(); // 장르별 스트리밍 sort, keyset의 ArrayList반환
while(it.hasNext()){
String key = (String)it.next();
Iterator indexIt = sortByValue((HashMap<Integer, Integer>)genresMap.get(key)).iterator();
// 장르안 sort , keyset의 ArrayList반환
int playsCnt = 0;
while(indexIt.hasNext()){
resultAL.add((int)indexIt.next());
mCnt++;
playsCnt++;
if(playsCnt > 1) break; //곡수가 2개가 넘으면 break; 그리고 다시 다른 장르종류를 탐색
}
}
int[] answer = new int[resultAL.size()];
for(int i = 0; i < resultAL.size(); i++){
answer[i] = resultAL.get(i).intValue();
}
return answer;
}
private ArrayList sortByValue(final Map map){
ArrayList<Object> keyList = new ArrayList();
keyList.addAll(map.keySet());
Collections.sort(keyList, new Comparator(){
public int compare(Object o1, Object o2){
Object v1 = map.get(o1);
Object v2 = map.get(o2);
return ((Comparable) v2).compareTo(v1);
}
});
return keyList;
}
}
이건 다른사람이 푼 코드
addAll이라는 함수를 통해서 Set을 ArrayList로 바꿀수 있다는걸 알게됬다.
이걸 알았으면 내가 직접 ArrayList를 선언해서 넣을 필요는 없었겠다는 생각은 든다.
그리고 HashMap의 타입도 Object를 활용한게 눈에 들어왔다.
'프로그래머스 코딩테스트' 카테고리의 다른 글
[프로그래머스]스택/큐 - 트럭문제 (0) | 2020.07.20 |
---|---|
[프로그래머스] 스택/큐 - 탑 문제 (0) | 2020.07.20 |
[프로그래머스] 해시-위장 문제 (0) | 2020.07.20 |