https://school.programmers.co.kr/learn/courses/30/lessons/42579?language=java
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
위의 링크로 문제 설명은 생략.
풀이:
주어진 String[] genres, int[] plays 배열들이 있다.
String [] genres = { "classic", "pop", "classic", "classic", "pop"};
int [] plays= {500, 600, 150, 800, 2500};
이 문제의 정답을 구하기 위해 필요한것은 크게 2 가지이다.
1. 장르별 총 재생수를 조회수 높은 장르부터 내림차순 되어야 함
2. 각 장르당 재생수대로 최대 2곡까지 수록, 한곡이면 한곡만 수록
1번을 구하려면 이런 구조의 자료형을 만들어야 한다.
2번을 구하려면 이런 구조의 자료형을 만들어야 한다.
전체코드
import java.util.*;
public class Main {
public int[] solution(String [] genres, int [] plays){
ArrayList<Integer> answer = new ArrayList<>();
//장르와 장르의 재생 수
HashMap<String,Integer> total = new HashMap<>();
//각 장르와 각 장르의 해당하는 곡번호,곡 조회수
HashMap<String,HashMap<Integer,Integer>> all_gen = new HashMap<>();
for(int i=0;i<genres.length;i++){
total.put(genres[i], total.getOrDefault(genres[i],0)+plays[i]);
//핵심코드 : 장르의 상세 조회수 put
HashMap<Integer, Integer> map = all_gen.getOrDefault(genres[i], new HashMap<>());
map.put(i, plays[i]);
all_gen.put(genres[i],map);
}
//핵심코드 : total 전체조회수(value)대로 내림차순 정렬
ArrayList<String> total_Keys = new ArrayList<>(total.keySet());
Collections.sort(total_Keys, (v1, v2) -> (total.get(v2)-total.get(v1)));
//핵심코드 : 장르의 포함된 곡들의 조회수별 내림차순 정렬 및 answer에 add
for(String key:total_Keys){
HashMap<Integer,Integer> map = all_gen.get(key);
ArrayList<Integer> detail_Keys = new ArrayList<>(map.keySet());
Collections.sort(detail_Keys, (v1,v2)->map.get(v2)-map.get(v1));
answer.add(detail_Keys.get(0));
if(detail_Keys.size()>1) answer.add(detail_Keys.get(1));
}
//배열로 리턴
return answer.stream().mapToInt(i -> i).toArray();
}
public static void main(String[] args) {
Main M = new Main();
Scanner kb = new Scanner(System.in);
String [] genres = { "classic", "pop", "classic", "classic", "pop"};
int [] plays= {500, 600, 150, 800, 2500};
System.out.println(Arrays.toString(M.solution(genres,plays)));
}
}
후기: Hash로 분류된 문제였지만 정렬 알고리즘이 주가 된 느낌이었고, class형에서의 정렬만 주로 했었는데
아래와 같은 방식도 익힐 수 있어서 좋았다
ArrayList<String> total_Keys = new ArrayList<>(total.keySet());
Collections.sort(total_Keys, (v1, v2) -> (total.get(v2)-total.get(v1)));
'알고리즘 > 문제풀이' 카테고리의 다른 글
프로그래머스 소수 찾기 - Java (0) | 2024.04.11 |
---|---|
[SWEA] 2806. N-Queen - 자바 (0) | 2024.04.04 |
다익스트라 알고리즘 기본 문제(각 정점의 최소 거리비용 출력)풀이 (2) | 2024.03.26 |
바둑이 승차 문제 (DFS) - Java (0) | 2024.02.26 |
그래프 최단거리 구하기 (BFS) - Java (0) | 2024.02.22 |