티스토리 뷰

반응형

https://school.programmers.co.kr/learn/courses/30/lessons/42579

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

# 힌트

TreeSet을 적절히 사용하면 정렬 코드를 줄일 수 있다.

장르 이름, 플레이 횟수 처럼 하나의 묶음으로 관리해야 하는 정보는 객체를 만든다.

 

테스트케이스 2, 15 힌트 : 제한 조건 3번을 참조할 것

 

해답 보기

더보기
    static class Music {
        int id;
        int playCount;

        public Music(int id, int playCount) {
            this.id = id;
            this.playCount = playCount;
        }

        @Override
        public String toString() {
            return this.id + ":" + this.playCount;
        }
    }

    static class Genre {
        public String genreName;
        public int totalPlayCount;

        public Genre(String genreName, int totalPlayCount) {
            this.genreName = genreName;
            this.totalPlayCount = totalPlayCount;
        }

        @Override
        public String toString() {
            return this.genreName + ":" + this.totalPlayCount;
        }
    }

    public static List<Integer> solution(String[] genres, int[] plays) {
        // 장르 - 음악 (인덱스, 플레이 횟수) 저장
        Map<String, TreeSet<Music>> map = new HashMap<>();
        for (int i = 0; i < genres.length; i++) {
            if (!map.containsKey(genres[i]))
                /* TreeSet에 저장할 때 자동 정렬 조건을 넣어준다.
                   첫 번째 정렬 조건은 playCount 내림차순, 두 번째 정렬 조건은 인덱스 오름 차순
                 */
                map.put(genres[i], new TreeSet<>((m1, m2) -> {
                    if (m1.playCount == m2.playCount) return m1.id - m2.id;
                    else return m2.playCount - m1.playCount;
                }));
            map.get(genres[i]).add(new Music(i, plays[i]));
        }

        // 장르 - 총 플레이 횟수를 저장
        List<Genre> genreList = new ArrayList<>();
        for (String genre : map.keySet()) {
            int total = 0;
            for (Music m : map.get(genre)) total += m.playCount;
            genreList.add(new Genre(genre, total));
        }

        // 디버깅 용 출력, toString을 override해야 값을 확인 가능
        System.out.println(map);
        System.out.println(genreList);

        // 장르 - 총 플레이 횟수를 내림차순으로 정렬
        genreList.sort((g1, g2) -> g2.totalPlayCount - g1.totalPlayCount);

        List<Integer> answer = new ArrayList<>();
        for (Genre genre : genreList) {
            TreeSet<Music> musics = map.get(genre.genreName);
            for (int j = 0; j < 2; j++) {
                // 음악이 한 개인 경우는 그것만 넣기
                if (musics.isEmpty()) break;
                answer.add(musics.pollFirst().id);
            }
        }
        return answer;
    }

 

solution이 static일 때 inner class는 static으로 선언해야 컴파일 오류가 안 난다.

반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크