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

2022. 10. 20. 17:52·코딩 테스트

한번에 로직이 세워지지 않았던 문제이다.

HashMap에 익숙해졌다고 생각했지만 values를 기준으로 내림차순 정렬하는데 어려움을 겪었다.

 


로직

먼저 genres와 play값을 HashMap에 넣어 각 장르별 플레이 횟수를 센다.

그리고 keySet을 리스트에 넣어 플레이 횟수별로 내림차순 정렬한다.

정렬된 list의 값을 순회하면서 첫번째와 두번째로 많이 재생된 노래의 인덱스를 result 리스트에 넣고

마지막으로 배열로 복사해서 반환하면 된다.

 

최종 코드

import java.util.*;
class Solution {
    public int[] solution(String[] genres, int[] plays) {
         List<Integer> result = new ArrayList<>();

        // 각 장르별로 HashMap에 넣기
        HashMap<String, Integer> genreMap = new HashMap<>();
        for (int i = 0; i < genres.length; i++) {
            genreMap.put(genres[i], genreMap.getOrDefault(genres[i], 0) + plays[i]);
        }

        // keySet을 value 기준으로 내림차순 정렬
        List<String> list = new ArrayList<>(genreMap.keySet());
        Collections.sort(list, (o1, o2) -> genreMap.get(o2) - genreMap.get(o1));

        for (int i = 0; i < list.size(); i++) {

            String s = list.get(i);

            // 첫번째로 많이 재생된 노래 찾기
            int firstMax = 0;
            int firstIdx = -1;

            for (int j = 0; j < genres.length; j++) {
                if (genres[j].equals(s) && firstMax < plays[j]) {
                    firstMax = Math.max(firstMax, plays[j]);
                    firstIdx = j;
                }
            }

            // 두번째로 많이 재생된 노래 찾기
            int secondMax = 0;
            int secondIdx = -1;
            for (int j = 0; j < genres.length; j++) {
                if (genres[j].equals(s) && secondMax < plays[j] && j != firstIdx) {
                    secondMax = plays[j];
                    secondIdx = j;
                }
            }
            // 재생된 노래 리스트에 저장
            result.add(firstIdx);
            // 두번째로 재생된 노래가 있다면 리스트에 저장
            if (secondIdx >= 0) {
                result.add(secondIdx);
            }
        }

        // 리스트값 배열로 복사
        int[] answer = new int[result.size()];
        for (int i = 0; i < result.size(); i++) {
            answer[i] = result.get(i);
        }

        return answer;
    }
}

 

 

 

저작자표시 (새창열림)

'코딩 테스트' 카테고리의 다른 글

(Java) 프로그래머스 - 둘만의 암호  (0) 2023.02.16
(Java) 프로그래머스 - 카드 뭉치  (0) 2023.02.16
(Java) 프로그래머스 - 단속카메라  (0) 2022.10.17
(Java) 프로그래머스 - 등굣길  (0) 2022.10.17
(Java) 프로그래머스 - 단어 변환  (0) 2022.10.11
'코딩 테스트' 카테고리의 다른 글
  • (Java) 프로그래머스 - 둘만의 암호
  • (Java) 프로그래머스 - 카드 뭉치
  • (Java) 프로그래머스 - 단속카메라
  • (Java) 프로그래머스 - 등굣길
로승리
로승리
  • 로승리
    Roy's Blog
    로승리
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Issuefy
      • Language
      • Spring
      • Database
      • Network
      • Kubernetes
      • AWS
      • 코드스쿼드
      • 코딩 테스트
      • 생각정리
      • 국비지원
      • 회고
      • 컨퍼런스, 세미나
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
로승리
(Java) 프로그래머스 - 베스트앨범
상단으로

티스토리툴바