티스토리 뷰

해시문제 베스트 앨범

코드

class Solution {
    public int[] solution(String[] genres, int[] plays) {
        int[] answer = {};
        HashMap<String,PlayData> map = new HashMap<>();
        for (int i = 0; i < genres.length; i++) {
            PlayData playData;
            playData = new PlayData(i);
            playData.put(i, plays[i]);
            map.merge(genres[i], playData, PlayData::merge);
        }
        Iterator iterator = PlayData.sortByTotalValue(map).iterator();
        ArrayList<Integer> list = new ArrayList<>();

        while(iterator.hasNext()) {
            String temp = (String) iterator.next();
            HashMap<Integer, Integer> result = map.get(temp).getPlayList();
            Iterator playIterator = sortByValue(result).iterator();
            int i = 0;
            while(playIterator.hasNext() && i < 2) {
                i++;
                list.add((int)playIterator.next());
            }

        }
        answer = list.stream().mapToInt(i->i).toArray();

        return answer;
    }

    public static List sortByValue(HashMap allList) {

        List<Integer> list = new ArrayList();
        list.addAll(allList.keySet());
        Collections.sort(list,new Comparator() {
            public int compare(Object o1,Object o2) {
                Object v1 = allList.get(o1);
                Object v2 = allList.get(o2);
                return ((Comparable) v2).compareTo(v1);
            }

        });
        return list;

    }
}

class PlayData {
    private HashMap<Integer, Integer> allList = new HashMap<>();

    private int total = 0;
    int index;
    int plays;
    public PlayData(int index) {
        this.index = index;
    }
    public HashMap<Integer, Integer> getPlayList() {
        return allList;
    }
    public int getTotal() {
        return total;
    }
    public int[] getPlayInfo() {
        return new int[]{index, plays};
    }
    public void put(int index, int plays) {
        this.plays = plays;
        this.total += plays;
        allList.put(index, plays);
    }

    public static PlayData merge(PlayData playData, PlayData playData1) {

        int[] value = playData1.getPlayInfo();
        playData.put(value[0], value[1]);
        return playData;
    }
    public static List sortByTotalValue(HashMap allList) {

        List<Integer> list = new ArrayList();
        list.addAll(allList.keySet());
        Collections.sort(list,new Comparator() {
            public int compare(Object o1,Object o2) {
                Object v1 = ((PlayData)allList.get(o1)).getTotal();
                Object v2 = ((PlayData)allList.get(o2)).getTotal();
                return ((Comparable) v2).compareTo(v1);
            }
        });
        return list;
    }
}

코드 내용 요약

for (int i = 0; i < genres.length; i++) {
        PlayData playData;
        playData = new PlayData(i);
        playData.put(i, plays[i]);
        map.merge(genres[i], playData, PlayData::merge);
}

한 장르의 데이터를 맵에 넣기위해 PlayData 클래스를 만들어서 같은 장르를 인덱스별로 보관하기 위해 PlayData 클래스 내부에 allList라는 맵을 만들어주고 인덱스와 플레이 횟수를 저장해줌

 

public static PlayData merge(PlayData playData, PlayData playData1) {
        int[] value = playData1.getPlayInfo();
        playData.put(value[0], value[1]);
        return playData;
}

map.merge를 사용해서 같은 장르의 앨범을 PlayData 안의 allList에 넣도록 해줌

 

public static List sortByTotalValue(HashMap allList) {
        List<Integer> list = new ArrayList();
        list.addAll(allList.keySet());
        Collections.sort(list,new Comparator() {
                public int compare(Object o1,Object o2) {
                        Object v1 = ((PlayData)allList.get(o1)).getTotal();
                        Object v2 = ((PlayData)allList.get(o2)).getTotal();
                        return ((Comparable) v2).compareTo(v1);
                }
        });
        return list;
}

총 플레이 횟수를 기준으로 정렬시키기 위한 코드 
list.addAll(allList.keySet()); 로 키값의 list를 리턴할 수 있도록 처리

 

public static List sortByValue(HashMap allList) {

        List<Integer> list = new ArrayList();
        list.addAll(allList.keySet());
        Collections.sort(list,new Comparator() {
                public int compare(Object o1,Object o2) {
                        Object v1 = allList.get(o1);
                        Object v2 = allList.get(o2);
                        return ((Comparable) v2).compareTo(v1);
                }
        });
        return list;
}

같은 장르의 노래들을 플레이 수 순으로 정렬 후
while(playIterator.hasNext() && i < 2) {
        i++;
        list.add((int)playIterator.next());
}

최상위 곡 2개를 뽑아서 저장

 

answer = list.stream().mapToInt(i->i).toArray();

문제의 리턴형은 int형 배열이기 때문에 list를 int형 array로 바꾸는 mapToInt를 사용하여 변환

'개발 > Algorithm' 카테고리의 다른 글

프로그래머스 DP - 등굣길  (0) 2020.12.08
프로그래머스 DP - 도둑질  (0) 2020.12.05
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/06   »
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
글 보관함