https://school.programmers.co.kr/learn/courses/30/lessons/42579
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
풀이 방법
1. 장르별 재생 횟수 저장
2. 각 장르에 속한 노래의 <고유번호, 재생 횟수> 저장
3. 장르별 재생 횟수를 저장
4. 곡 수대로 내림차순 정렬
5. 정렬된 num의 순서대로 상위 2곡의 고유번호를 ArrayList에 저장
import java.util.*;
class Solution {
public int[] solution(String[] genres, int[] plays) {
ArrayList<Integer> answer = new ArrayList<>();
HashMap<String, Integer> num = new HashMap<>();
HashMap<String, HashMap<Integer, Integer>> music = new HashMap<>();
for(int i=0; i<plays.length; i++) {
if(!num.containsKey(genres[i])) {
HashMap<Integer, Integer> map = new HashMap<>();
map.put(i, plays[i]);
music.put(genres[i], map);
num.put(genres[i], plays[i]);
} else {
music.get(genres[i]).put(i, plays[i]);
num.put(genres[i], num.get(genres[i]) + plays[i]);
}
}
List<String> keySet = new ArrayList(num.keySet());
Collections.sort(keySet, (s1, s2) -> num.get(s2) - (num.get(s1)));
for(String key : keySet) {
HashMap<Integer, Integer> map = music.get(key);
List<Integer> genre_key = new ArrayList(map.keySet());
Collections.sort(genre_key, (s1, s2) -> map.get(s2) - (map.get(s1)));
answer.add(genre_key.get(0));
if(genre_key.size() > 1) {
answer.add(genre_key.get(1));
}
}
return answer.stream().mapToInt(i -> i).toArray();
}
}
HashMap<String, Integer> num = new HashMap<>();
| classic | pop |
| 500 + 150 + 1800 | 600 + 2500 |
1. num에 장르별 재생 횟수를 저장합니다.
HashMap<String, HashMap<Integer, Integer>> music = new HashMap<>();
| classic | pop |
| 0 2 3 | 1 4 |
| 500 150 800 | 600 2500 |
2. 각 장르에 속한 노래의 고유번호, 재생 횟수를 저장합니다.
3. 장르별 재생 횟수를 저장
| pop | classic |
| 3100 | 1450 |
4. 장르별 총 재생 횟수 정렬
List<String> keySet = new ArrayList(num.keySet());
Collections.sort(keySet, (s1, s2) -> num.get(s2) - (num.get(s1)));
5. 장르별 노래 정렬
for(String key : keySet) {
HashMap<Integer, Integer> map = music.get(key);
List<Integer> genre_key = new ArrayList(map.keySet());
Collections.sort(genre_key, (s1, s2) -> map.get(s2) - (map.get(s1)));
answer.add(genre_key.get(0));
if(genre_key.size() > 1) {
answer.add(genre_key.get(1));
}
}
코딩테스트를 위한 해시 자료구조
-----------------------------------------------------------------------------------------------------------------------------------
Key:Value의 구조를 갖는 자료구조
HashMap
- key는 중복 허용하지 않는다. (value는 가능) 중복된 값이 들어오면 덮어씌워짐
- 데이터 순서 없음
- put() : 데이터 삽입
- get(키값) : key의 value얻기
- getOrDefault(a, b) : a가 없으면 b를 출력, 있으면 value 값 출력
- remove(키값) : 해당 데이터 삭제
- containsKey(키값) : 해당 키가 존재하는지 여부 (boolean return)
- clear() : 전체 요소 삭제
- keySet() : 맵에 저장된 모든 키들을 Set 형태로 반환
HashSet
- 중복을 허용하지 않는 집합
- 데이터 순서 없음
- add() : 데이터 삽입
- contains() : 해당 원소 포함 여부(boolean return)
해시 테이블, 해시 함수, 해시 충돌, 해싱에 대한 설명
https://github.com/AnChanUng/TIL/blob/main/algorithm/hash.md
'algorithm' 카테고리의 다른 글
| [코딩테스트] 2025년 빈출 유형 (0) | 2025.10.05 |
|---|---|
| [백준/20437] 문자열 게임 2 (슬라이딩 윈도우, C++) (0) | 2025.10.04 |
| [프로그래머스/SQL] 흉부외과 또는 일반외과 의사 목록 출력하기 (0) | 2024.08.20 |
| 백트래킹 부수기 N과 M 시리즈 (0) | 2024.08.19 |
| [백준(BOJ)] 2667번 : 단지번호 붙이기 - Python(파이썬) - (실버1, BFS DFS) (0) | 2024.08.18 |