[ 다먹살 ]/- Coding

[프로그래머스] 레벨3 베스트앨범

엉망으로살기 2023. 4. 17. 14:25
반응형

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

프로그래머스

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

programmers.co.kr

 
확실히 레벨3부터는 조금 생각을 해야되는 문제가 많은 것 같다. 이 문제는 장르에 속한 노래의 갯수뿐만 아니라 각 노래의 재생 수도 함께 알아야하기 때문에 단순히 Hash를 사용해서 풀수는 없다고 생각했다.
그래서 별도로 music 클래스를 만들어서 장르별로 변수를 설정해서 장르별 재생 수(play)와 노래별 고유번호(playlist[0])와 재생 수(playlist[1])를 사용했다. 일단 music에 들어가는 변수가 만들어졌다면, 최소 노래는 1개 이상이므로 playlist 자체 역시도 ArrayList를 사용해서 관리했다. 이미 설명한대로 0번째 인덱스가 고유번호, 1번째 인덱스가 재생 수이다.
그 후 각 조건에 맞게 Collections.sort() 메소드와 Comparator 라이브러리를 이용해서 정렬한 후, 조건에 맞게 출력해주었다. 여기서 주의할 점은 노래가 1개일 경우에는 다른 조건에 상관없이 무조건 1개만 들어가는 것, 2개 이상일 경우에는 무조건 2개가 들어가는 것이었다. 


문제 및 입출력


코드  
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

class Solution
{
    static class music
    {
        ArrayList<int[]> playlist = new ArrayList<int[]>();
        String genre;
        int play;

        music(int index, String genre, int play)
        {
            this.playlist.add(new int[] {index, play});
            this.genre = genre;
            this.play = play;
        }
    }
    public Object[] solution(String[] genres, int[] plays)
    {
        ArrayList<music> m = new ArrayList<music>();

        for(int i=0; i<genres.length; i++)
        {
            boolean flag = true;

            for(music temp : m)
            {
                if(temp.genre.equals(genres[i]))
                {
                    temp.play += plays[i];
                    temp.playlist.add(new int[] {i, plays[i]});
                    flag = false;
                    break;
                }
            }
            if(flag)
            {
                music temp = new music(i, genres[i], plays[i]);
                m.add(temp);
            }
        }
        for(music temp : m)
        {
            Collections.sort(temp.playlist, new Comparator<int[]>()
            {
                @Override
                public int compare(int[] a, int[] b)
                {
                    if(a[1]==b[1])
                    {
                        return a[0]-b[0];
                    }
                    else
                    {
                        return b[1]-a[1];
                    }
                }
            });
        }

        Collections.sort(m, new Comparator<music>()
        {
            @Override
            public int compare(music m1, music m2)
            {
                return m2.play-m1.play;
            }
        });

        ArrayList<Integer> answer = new ArrayList<Integer>();

        for(music temp : m)
        {
            if(temp.playlist.size()==1)
            {
                answer.add(temp.playlist.get(0)[0]);
            }
            else
            {
                answer.add(temp.playlist.get(0)[0]);
                answer.add(temp.playlist.get(1)[0]);
            }
        }

        return answer.toArray();
    }
}

반응형