[코딩테스트] 베스트앨범

시나브로·2021년 6월 12일
0

코딩테스트

목록 보기
4/34
post-thumbnail

문제


베스트앨범 문제 바로가기



제출 코드(Java)


첫번째 코드 제출

import java.util.*;


class Solution {
	public static int[] solution(String[] genres, int[] plays) {
        List<Integer> resultList = new ArrayList<>();
        Map<String, List<Music>> playListMap = new HashMap<>();
        Map<String, Integer> playCountMap = new HashMap<>();

        for (int i = 0; i < genres.length; i++) {
            Music music = new Music().setIdx(i)
                    .setPlay(plays[i]);

            if (playListMap.containsKey(genres[i])){
                playListMap.get(genres[i])
                        .add(music);
                playCountMap.put(genres[i], playCountMap.get(genres[i]) + plays[i]);
            } else {
                playListMap.put(genres[i], new ArrayList<Music>(){{
                    add(music);
                }});
                playCountMap.put(genres[i], plays[i]);
            }
        }

        List<String> keySetList = new ArrayList(playCountMap.keySet());

        // 오름차순
        keySetList.sort((o1, o2) -> playCountMap.get(o2) - playCountMap.get(o1));



        for ( String key : keySetList){
            List<Music> musics = playListMap.get(key);
            Collections.sort(musics);
            int i = 0;
            for( Music music : musics){
                if( i++ > 1 ) break;
                resultList.add(music.getIdx());
            }
        }

        int[] result = new int[resultList.size()];

        int i = 0;
        for (Integer integer : resultList) {
            result[i++] = integer;
        }
        
        return result;

    }
    
    
    public static class Music implements Comparable<Music>{

        private int play;
        private int idx;

        public int getPlay() {
            return play;
        }

        public Music setPlay(int play) {
            this.play = play;
            return this;
        }

        public int getIdx() {
            return idx;
        }

        public Music setIdx(int idx) {
            this.idx = idx;
            return this;
        }

        @Override
        public int compareTo(Music o) {
            int result =  o.getPlay() - this.getPlay();
            return result == 0 ? (this.getIdx() - o.getIdx()) : result;

        }

        @Override
        public String toString() {
            return "Music{" +
                    "play=" + play +
                    ", idx=" + idx +
                    '}';
        }
    }
}

정렬을 위한 Music 내부 Class와 Comparable를 구현해 쉽게 풀어냈다


정확성 테스트

정확성  테스트
테스트 1 〉	통과 (1.49ms, 52.5MB)
테스트 2 〉	통과 (2.80ms, 52.7MB)
테스트 3 〉	통과 (3.66ms, 53.4MB)
테스트 4 〉	통과 (3.03ms, 53.3MB)
테스트 5 〉	통과 (1.63ms, 52.3MB)
테스트 6 〉	통과 (1.71ms, 52.1MB)
테스트 7 〉	통과 (1.71ms, 53.1MB)
테스트 8 〉	통과 (1.49ms, 51.7MB)
테스트 9 〉	통과 (1.53ms, 53.7MB)
테스트 10 〉	통과 (1.65ms, 52.6MB)
테스트 11 〉	통과 (2.37ms, 52MB)
테스트 12 〉	통과 (1.71ms, 52.6MB)
테스트 13 〉	통과 (1.67ms, 52.3MB)
테스트 14 〉	통과 (1.76ms, 52.7MB)
테스트 15 〉	통과 (6.27ms, 54.2MB)




두번째 코드 제출

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();

        while(it.hasNext()){
            String key = (String)it.next();
            Iterator indexIt = sortByValue((HashMap<Integer, Integer>)genresMap.get(key)).iterator();
            int playsCnt = 0;

            while(indexIt.hasNext()){
                resultAL.add((int)indexIt.next());
                mCnt++;
                playsCnt++;
                if(playsCnt > 1) 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;
    }
}

다른 인원이 제출한 코드이나, 내부 Class가 아닌 JCF통해 풀어냈다


정확성 테스트

테스트 1 〉	통과 (0.51ms, 51.9MB)
테스트 2 〉	통과 (0.57ms, 52.2MB)
테스트 3 〉	통과 (0.50ms, 53.9MB)
테스트 4 〉	통과 (0.48ms, 52.7MB)
테스트 5 〉	통과 (0.91ms, 52.8MB)
테스트 6 〉	통과 (0.84ms, 52MB)
테스트 7 〉	통과 (0.78ms, 51.9MB)
테스트 8 〉	통과 (0.63ms, 52.7MB)
테스트 9 〉	통과 (0.53ms, 52.1MB)
테스트 10 〉	통과 (1.53ms, 52.5MB)
테스트 11 〉	통과 (0.55ms, 52.1MB)
테스트 12 〉	통과 (0.70ms, 52.2MB)
테스트 13 〉	통과 (0.80ms, 52.4MB)
테스트 14 〉	통과 (0.97ms, 52.7MB)
테스트 15 〉	통과 (0.63ms, 52.1MB)

JCF와 Iterator를 사용해서 그런지 속도가 장난아니게 빠르다,, 가시성을 위해 inner Class를 사용했지만 효율성을 고려해 JCF만 사용해는 것을 고려해봐야겠다



제출 코드(Python)


코드 제출

def solution(genres, plays):
    answer = []
    dic = {}
    album_list = []
    for i in range(len(genres)):
        dic[genres[i]] = dic.get(genres[i], 0) + plays[i]
        album_list.append(album(genres[i], plays[i], i))

    dic = sorted(dic.items(), key=lambda dic:dic[1], reverse=True)
    album_list = sorted(album_list, reverse=True)



    while len(dic) > 0:
        play_genre = dic.pop(0)
        print(play_genre)
        cnt = 0;
        for ab in album_list:
            if play_genre[0] == ab.genre:
                answer.append(ab.track)
                cnt += 1
            if cnt == 2:
                break

    return answer

class album:
    def __init__(self, genre, play, track):
        self.genre = genre
        self.play = play
        self.track = track

    def __lt__(self, other):
        return self.play < other.play
    def __le__(self, other):
        return self.play <= other.play
    def __gt__(self, other):
        return self.play > other.play
    def __ge__(self, other):
        return self.play >= other.play
    def __eq__(self, other):
        return self.play == other.play
    def __ne__(self, other):
        return self.play != other.play

내부 클래스를 사용해 풀어냈다


정확성 테스트

정확성  테스트
테스트 1 〉	통과 (0.03ms, 10.4MB)
테스트 2 〉	통과 (0.03ms, 10.3MB)
테스트 3 〉	통과 (0.02ms, 10.3MB)
테스트 4 〉	통과 (0.02ms, 10.3MB)
테스트 5 〉	통과 (0.21ms, 10.3MB)
테스트 6 〉	통과 (0.18ms, 10.3MB)
테스트 7 〉	통과 (0.11ms, 10.3MB)
테스트 8 〉	통과 (0.07ms, 10.3MB)
테스트 9 〉	통과 (0.03ms, 10.3MB)
테스트 10 〉	통과 (0.22ms, 10.2MB)
테스트 11 〉	통과 (0.04ms, 10.3MB)
테스트 12 〉	통과 (0.11ms, 10.3MB)
테스트 13 〉	통과 (0.19ms, 10.3MB)
테스트 14 〉	통과 (0.22ms, 10.3MB)
테스트 15 〉	통과 (0.03ms, 10.3MB)

부끄럽게도 아직 python에 대한 문법 지식이 부족해 답변을 참고하였다. 자바 제출 코드와 비슷한 유형이지만 python 문법과의 차이를 다시 다져보는 시간. :)



profile
Be More!

0개의 댓글