[프로그래머스 알고리즘 고득점 Kit][해시][Java] 베스트앨범

2026. 3. 2. 16:58·알고리즘 & 자료구조/해시

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

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

이 문제는 알고리즘 초보자라면 꼭 풀어봐야할 문제 같았다.

정렬 기준이 여러 개,

여러 타입의 변수를 어떻게 관리할 것인가를 고민해볼 수 있는 문제

 

1. 정답 코드

필요한 데이터는 

노래 하나에 대해서 장르가 무엇인지

그 장르는 총 몇 회 플레이 되었는지

이 노래는 몇 회 플레이 되었는지

몇 번 노래인지

이렇게 뭐가 많이 필요할 때는 

가장먼저 클래스를 떠올리는 것같다.

배열로 어떻게 할 수는 있겠지만

그냥 편하니까.

그리고 조금 헷갈렸던 것이

장르당 2개씩 가져오는 것을 어떻게 하지?

고민했는데 그냥 해시맵 하나 더 만들어서 
 선택한 횟수를 관리하면 되는 거 였다.

import java.util.*;

class Solution {
    public int[] solution(String[] genres, int[] plays) {

	//장르별 총 횟수 구하기
        HashMap<String, Integer> genre = new HashMap<>();
        int songNum = genres.length;
        for(int i=0; i<songNum; i++){
            genre.put(genres[i], genre.getOrDefault(genres[i], 0) + plays[i]);
        }
	//각 노래에 대한 데이터 저장
        Song[] songs = new Song[songNum];
        for(int i=0; i<songNum; i++){
            songs[i] = new Song(genres[i], genre.get(genres[i]), plays[i], i);
        }
	// 주어진 정렬 조건에 대해서 정렬하기
        Arrays.sort(songs, (s1, s2) -> {
            if(s1.genrePlayCnt == s2.genrePlayCnt) {
                if(s1.songPlayCnt == s2.songPlayCnt) {
                    return Integer.compare(s1.index, s2.index);
                }
                return Integer.compare(s2.songPlayCnt, s1.songPlayCnt);
            }
            return Integer.compare(s2.genrePlayCnt, s1.genrePlayCnt);
        });
    
	//장르별 2개씩 고르기
        HashMap<String, Integer> pickCnt = new HashMap<>();
        ArrayList<Integer> ans = new ArrayList<>();
        for(int i=0; i<songNum; i++){
            int count = pickCnt.getOrDefault(songs[i].genre, 0);
            if(count == 2) continue;

            ans.add(songs[i].index);
            pickCnt.put(songs[i].genre, count + 1);
        }
        int[] answer = new int[ans.size()];
        for(int i=0; i<ans.size(); i++){
            answer[i] = ans.get(i);
        }
        return answer;
    }
    class Song {
        String genre;
        int genrePlayCnt;
        int songPlayCnt;
        int index;
        Song (String genre, int genrePlayCnt, int songPlayCnt, int index) {
            this.genre = genre;
            this.genrePlayCnt = genrePlayCnt;
            this.songPlayCnt = songPlayCnt;
            this.index = index;
        }
    }
}

'알고리즘 & 자료구조 > 해시' 카테고리의 다른 글

[프로그래머스 알고리즘 고득점 Kit][해시][Java] 의상  (0) 2026.02.22
[프로그래머스 알고리즘 고득점 Kit][해시][Java] 전화번호 목록  (0) 2026.02.20
[프로그래머스 알고리즘 고득점 Kit][해시][Java] 포켓몬  (0) 2026.02.17
[프로그래머스 알고리즘 고득점 Kit][해시][Java] 완주하지 못한 선수  (0) 2026.02.15
'알고리즘 & 자료구조/해시' 카테고리의 다른 글
  • [프로그래머스 알고리즘 고득점 Kit][해시][Java] 의상
  • [프로그래머스 알고리즘 고득점 Kit][해시][Java] 전화번호 목록
  • [프로그래머스 알고리즘 고득점 Kit][해시][Java] 포켓몬
  • [프로그래머스 알고리즘 고득점 Kit][해시][Java] 완주하지 못한 선수
수수다
수수다
우하하
  • 수수다
    그냥살자
    수수다
  • 전체
    오늘
    어제
    • 분류 전체보기 (20) N
      • 프로젝트 (1)
      • 알고리즘 & 자료구조 (17) N
        • 분리 집합 (1)
        • 정렬 (1)
        • 유클리드 호제법 (1)
        • 이분 탐색 (2) N
        • 해시 (5)
        • 그래프 (2)
        • 스택 (1)
        • 큐 (0)
        • 완전 탐색 (1)
        • DFS (0)
        • BFS (2)
        • 힙 (1)
      • 데이터베이스 (0)
      • CS (0)
      • 기타 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 네이버 블로그
  • 공지사항

  • 인기 글

  • 태그

    코팅테스트
    유니온파인드
    이분탐색
    프로그래머스
    매개변수탐색
    Java
    bfs
    코테
    프로그래머스 알고리즘 고득점 kit
    해시
    고가용성
    삼성청년SW·AI아카데미
    바킹독
    귀멸의칼날
    SSAFY
    그래프
    코딩테스트
    디스조인트셋
    완전탐색
    분리집합
    알고리즘
    유클리드호제법
    싸피
    바이브코딩
    DisjointSet
    평균회귀
    백엔드
    깊이/너비 우선 탐색(DFS/BFS)
    비전공자
    union-find
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
수수다
[프로그래머스 알고리즘 고득점 Kit][해시][Java] 베스트앨범
상단으로

티스토리툴바