[프로그래머스 알고리즘 고득점 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)
  • 블로그 메뉴

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

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

  • 인기 글

  • 태그

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

  • 최근 글

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

티스토리툴바