Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
Tags
- level3
- heap area #stack area #static area #jvm
- java #추상클래스
- 25304번
- 주니어 백엔드 개발자
- server engineer
- 단계10
- 정보처리기사 실기 #정처기 실기 #2024년 2회 #정처기 2024년 2회 #공부법 # 꿀팁
- 브루트 포스법
- java #예외처리 #throw #throws
- 올 겨울은 조금 따뜻할 것 같다.
- static #자바 메모리 구조 #멤버 변수
- 자바 #자바문법 #자바기초 #참조형 #기본형
- tibero 7.23
- level2
- 반복문
- 이분탐색
- Next.js
- 넥슨개발자컨퍼런스
- 서버 엔지니어
- server developer
- ndc2025
- 나는야 4학년 #5학년 까지 가보자구
- 서버 개발자
- software enginner
- 2798블랙잭
- tmax tibero
- Spring
- object 클래스 # java
- 백엔드 개발자 로드맵
Archives
- Today
- Total
개발자 쿠키
[프로그래머스 level3] - 베스트앨범 (Java), 해시(hash)에 대한 모든 것(코딩테스트를 위한 해시, CS를 위한 해시) 본문
algorithm
[프로그래머스 level3] - 베스트앨범 (Java), 해시(hash)에 대한 모든 것(코딩테스트를 위한 해시, CS를 위한 해시)
개발자 쿠키 2025. 1. 27. 16:04https://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 |