본문 바로가기
문제풀이/프로그래머스

[JAVA] 프로그래머스 - 베스트앨범

by 그적 2023. 5. 11.

목차

  • 문제
  • 내가 푼 방법
  • 자바 코드
  • 결과 및 회고

1. 문제

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

 

프로그래머스

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

programmers.co.kr


2. 내가 푼 방법

Map과 정렬을 통해 풀 수 있을 것 같다는 판단이 들었다.

 

처음엔 Map<String, List<Integer>> 타입의 genresMap이라는 변수를 선언하여 장르별로 인덱스 번호를 저장한 후, answer 배열을 선언해 주기 위해 수록되는 노래 개수를 카운팅 해줬다.

 

이제 Map을 이용한 아래 두 가지 과정이 남았다.

1) 속한 노래가 많이 재생된 장르 정렬

2) 장르 내 많이 재생된 노래 정렬

 

나는 주로 new Comparator<>() 를 새로 선언해 compare 함수를 오버라이딩해서 사용한다.

먼저 속한 노래가 많이 재생된 장르순으로 정렬하는 코드이다.

List<Map.Entry<String, List<Integer>>> entrySet = new LinkedList<Map.Entry<String, List<Integer>>>(genresMap.entrySet());
Collections.sort(entrySet, new Comparator<Map.Entry<String, List<Integer>>>(){
    @Override
    public int compare(Map.Entry<String, List<Integer>> a, Map.Entry<String, List<Integer>> b) {
        Integer aCnt = 0;
        Integer bCnt = 0;

        for (int aNum : a.getValue()) {
            aCnt += plays[aNum];
        }
        for (int bNum : b.getValue()) {
            bCnt += plays[bNum];
        }

        return Integer.compare(bCnt, aCnt);
    }
});

 

그다음으로 장르 내 많이 재생된 노래를 오름차순으로 정렬하면서, answer에 바로바로 넣어주는 코드이다.

int[] answer = new int[cnt];
int idx = 0;

for (Map.Entry<String, List<Integer>> entry : entrySet) {
    List<Integer> list = entry.getValue();

    Collections.sort(list, new Comparator<Integer>(){
        @Override
        public int compare (Integer a, Integer b) {
            if (plays[a] == plays[b]) return 1;

                return Integer.compare(plays[b], plays[a]);
            }
    });

    answer[idx++] = list.get(0);

    if (list.size() >= 2) {
        answer[idx++] = list.get(1);
    }
}

3. 자바 코드

깃허브 풀이 주소

https://github.com/geujeog/Programmers/blob/main/Solution_%EB%B2%A0%EC%8A%A4%ED%8A%B8%EC%95%A8%EB%B2%94.java

import java.util.*;

class Solution {
    public int[] solution(String[] genres, int[] plays) {
        Map<String, List<Integer>> genresMap = new HashMap<>();
        
        for (int i = 0; i < genres.length; i++) {
            List<Integer> tmp = new ArrayList<>();
            
            if (genresMap.containsKey(genres[i])) {
                tmp = genresMap.get(genres[i]);
            }
            
            tmp.add(i);
            genresMap.put(genres[i], tmp);
        }
        
        int cnt = 0;
        
        Iterator<String> iter = genresMap.keySet().iterator();
        while (iter.hasNext()) {
            String key = iter.next();
            
            if (genresMap.get(key).size() >= 2) cnt += 2;
            else cnt += 1;
        }
        
        List<Map.Entry<String, List<Integer>>> entrySet = new LinkedList<Map.Entry<String, List<Integer>>> (genresMap.entrySet());
        Collections.sort(entrySet, new Comparator<Map.Entry<String, List<Integer>>>(){
            @Override
            public int compare(Map.Entry<String, List<Integer>> a, Map.Entry<String, List<Integer>> b) {
                Integer aCnt = 0;
                Integer bCnt = 0;
                
                for (int aNum : a.getValue()) {
                    aCnt += plays[aNum];
                }
                for (int bNum : b.getValue()) {
                    bCnt += plays[bNum];
                }
                
                return Integer.compare(bCnt, aCnt);
            }
        });
        
        int[] answer = new int[cnt];
        int idx = 0;
        
        for (Map.Entry<String, List<Integer>> entry : entrySet) {
            List<Integer> list = entry.getValue();
            
            Collections.sort(list, new Comparator<Integer>(){
                @Override
                public int compare (Integer a, Integer b) {
                    if (plays[a] == plays[b]) return 1;
                    
                    return Integer.compare(plays[b], plays[a]);
                }
            });
            
            answer[idx++] = list.get(0);
            
            if (list.size() >= 2) {
                answer[idx++] = list.get(1);
            }
        }
        
        return answer;
    }
}

4. 결과 및 회고

중간에 오타 때문에 삽질하는 부분이 생겼는데 정신 차리고 제대로 확인하면서 풀자.

 

댓글