새소식

항해 99 TIL

99클럽 코테 스터디 5일차 TIL [Map, List]

  • -

- 오늘의 학습 키워드 : Java - Map, List 활용

[문제 이름 : 베스트앨범]

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

내가 작성한 코드는 아래와 같다.

import java.util.*;

class Solution {
    public int[] solution(String[] genres, int[] plays) {
        // 장르 리스트
       List<Genre> genreList = new ArrayList<>();
        // 장르 이름, 해당 장르에 대한 정보 저장
        Map<String, Genre> genreMap = new HashMap<>();
        
        for (int i = 0; i < genres.length; i++) {
            String genre = genres[i];
            int playCount = plays[i];
            // 각 노래에 대한 정보 저장
            Song song = new Song(i, playCount);

            genreMap.putIfAbsent(genre, new Genre(genre));
            // Song 정보 추가
            genreMap.get(genre).addSong(song);
        }
        
        genreList.addAll(genreMap.values());
        // 총 플레이 수에 따라 정렬
        Collections.sort(genreList);
        
        List<Integer> bestAlbum = new ArrayList<>();
        for (Genre genre : genreList) {
            List<Song> songs = genre.songs;
            bestAlbum.add(songs.get(0).num);
            if (songs.size() > 1) {
                // 같은 장로가 두 개 이상인 곡이면 베스트 앨범에 추가
                bestAlbum.add(songs.get(1).num);
            }
        }
        
        int[] result = new int[bestAlbum.size()];
        for (int i = 0; i < bestAlbum.size(); i++) {
            result[i] = bestAlbum.get(i);
        }
        return result;
    }
    
     static class Song {
        int num;
        int play;

        Song(int num, int play) {
            this.num = num;
            this.play = play;
        }
    }

    static class Genre implements Comparable<Genre> {
        String name;
        int totalPlays;
        List<Song> songs;

        Genre(String name) {
            this.name = name;
            this.songs = new ArrayList<>();
            this.totalPlays = 0;
        }

        void addSong(Song song) {
            songs.add(song);
            totalPlays += song.play;
            Collections.sort(
                songs, (a, b) ->  b.play == a.play ? a.num - b.num : b.play - a.play);
        }

        @Override
        public int compareTo(Genre g) {
            return g.totalPlays - this.totalPlays;
        }
    }
}

 

처음에는 Map<String, Integer>로 각 장르에 대한 총합을 구현하여 그 값을 가져와서 Song 클래스 내부에서 정렬을 구현하려 했는데, 중간에 막혀서 Song 클래스와 Genre 클래스를 따로 생성해주었다.

 

Song 클래스에는 고유 번호와, 재생횟수를 저장한다.

Genre 클래스에는 장르 이름, Song 리스트, 재생횟수의 총합 정보를 담고 있으며, 각 노래를 추가할 때마다 총 재생횟수를 추가하고, song 리스트에 대해 정렬을 추가해 주었다.

마지막으로, Genre 리스트 비교를 위해 Comparable을 사용하여 총 재생횟수로 정렬이 가능하도록 구현하였다.

 

내일은 Map에서 Entry를 사용하는 방법과, Set을 연계해서 사용하는 방법에 대해 공부해보려 한다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.