Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
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
Archives
Today
Total
관리 메뉴

발전하는 개발자가 되자

프로그래머스 알고리즘: 베스트앨범 (java) 본문

개발공부/알고리즘

프로그래머스 알고리즘: 베스트앨범 (java)

백경훈 2019. 2. 11. 20:18

프로그래머스 알고리즘 (java)

베스트앨범

프로그래머스 (베스트앨범)

코드 리뷰

저는 먼저 음악으로 클래스를 나누고 장르로 그 클래스들을 감싸서 내림차순으로 정렬 시켰습니다.

객체를 두개로 나누고 override 메소드까지 구현하니 조금 코드 길이가 길어진거 같습니다.

import java.util.*;

public class BestAlbum {
    public int[] solution(String[] genres, int[] plays) {
        int[] answer = {};
        List<Integer> answerList = new ArrayList<>();

        List<Genres> genresList = new ArrayList<>();
        for (int i = 0; i < genres.length; i++) {
            if (!genresList.contains(new Genres(genres[i]))) {
                genresList.add(new Genres(genres[i]));
                genresList.get(genresList.indexOf(new Genres(genres[i]))).add(new Song(i,plays[i]));
            } else {
                genresList.get(genresList.indexOf(new Genres(genres[i]))).add(new Song(i,plays[i]));
            }
        }
        genresList.sort(Genres::compareTo);

        for (Genres genres1 : genresList) {
            genres1.answerAdd(answerList);
        }

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

    public class Genres implements Comparable<Genres> {
        private String genres;

        private PriorityQueue<Song> list = new PriorityQueue<>(Song::compareTo);

        public Genres() {
        }

        public Genres(String genres) {
            this.genres = genres;
        }

        public void add(Song song) {
            list.offer(song);
        }

        public int sumAll() {
           return list.stream().mapToInt(value -> value.plays).sum();
        }

        public void answerAdd(List<Integer> answers) {
            if (list.size() == 1) {
                answers.add(list.poll().index);
            } else {
                answers.add(list.poll().index);
                answers.add(list.poll().index);
            }
        }

        @Override
        public int compareTo(Genres o) {
            if (this.sumAll() < o.sumAll()) {
                return 1;
            } else if (this.sumAll() > o.sumAll()) {
                return -1;
            }
            return 0;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Genres genres1 = (Genres) o;
            return Objects.equals(genres, genres1.genres);
        }

        @Override
        public int hashCode() {
            return Objects.hash(genres);
        }

        @Override
        public String toString() {
            return "Genres{" +
                    "genres='" + genres + '\'' +
                    '}';
        }
    }

    public class Song implements Comparable<Song>{
        private int index;
        private int plays;

        public Song(int index, int plays) {
            this.index = index;
            this.plays = plays;
        }

        @Override
        public int compareTo(Song o) {
            if (this.plays < o.plays) {
                return 1;
            } else if (this.plays > o.plays) {
                return -1;
            }
            return 0;
        }
    }
}

다른사람들의 코드중 참고할 만한 사항

저만 길게 푼줄 알았는데 이 문제는 다들 비슷하게 푼거같습니다. 다음에 한번 더 풀어보면 더 나은 코드가 나올거 같습니다.

Comments