Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

개발 일기장

[프로그래머스] 해쉬-베스트 엘범 문제 본문

프로그래머스 코딩테스트

[프로그래머스] 해쉬-베스트 엘범 문제

enow 2020. 7. 20. 00:07
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를 활용한게 눈에 들어왔다.

Comments