목차
- 문제
- 내가 푼 방법
- 자바 코드
- 결과 및 회고
1. 문제
https://school.programmers.co.kr/learn/courses/30/lessons/42579
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
2. 내가 푼 방법
Map과 정렬을 통해 풀 수 있을 것 같다는 판단이 들었다.
처음엔 Map<String, List<Integer>> 타입의 genresMap이라는 변수를 선언하여 장르별로 인덱스 번호를 저장한 후, answer 배열을 선언해 주기 위해 수록되는 노래 개수를 카운팅 해줬다.
이제 Map을 이용한 아래 두 가지 과정이 남았다.
1) 속한 노래가 많이 재생된 장르 정렬
2) 장르 내 많이 재생된 노래 정렬
나는 주로 new Comparator<>() 를 새로 선언해 compare 함수를 오버라이딩해서 사용한다.
먼저 속한 노래가 많이 재생된 장르순으로 정렬하는 코드이다.
List<Map.Entry<String, List<Integer>>> entrySet = new LinkedList<Map.Entry<String, List<Integer>>>(genresMap.entrySet());
Collections.sort(entrySet, new Comparator<Map.Entry<String, List<Integer>>>(){
@Override
public int compare(Map.Entry<String, List<Integer>> a, Map.Entry<String, List<Integer>> b) {
Integer aCnt = 0;
Integer bCnt = 0;
for (int aNum : a.getValue()) {
aCnt += plays[aNum];
}
for (int bNum : b.getValue()) {
bCnt += plays[bNum];
}
return Integer.compare(bCnt, aCnt);
}
});
그다음으로 장르 내 많이 재생된 노래를 오름차순으로 정렬하면서, answer에 바로바로 넣어주는 코드이다.
int[] answer = new int[cnt];
int idx = 0;
for (Map.Entry<String, List<Integer>> entry : entrySet) {
List<Integer> list = entry.getValue();
Collections.sort(list, new Comparator<Integer>(){
@Override
public int compare (Integer a, Integer b) {
if (plays[a] == plays[b]) return 1;
return Integer.compare(plays[b], plays[a]);
}
});
answer[idx++] = list.get(0);
if (list.size() >= 2) {
answer[idx++] = list.get(1);
}
}
3. 자바 코드
깃허브 풀이 주소
import java.util.*;
class Solution {
public int[] solution(String[] genres, int[] plays) {
Map<String, List<Integer>> genresMap = new HashMap<>();
for (int i = 0; i < genres.length; i++) {
List<Integer> tmp = new ArrayList<>();
if (genresMap.containsKey(genres[i])) {
tmp = genresMap.get(genres[i]);
}
tmp.add(i);
genresMap.put(genres[i], tmp);
}
int cnt = 0;
Iterator<String> iter = genresMap.keySet().iterator();
while (iter.hasNext()) {
String key = iter.next();
if (genresMap.get(key).size() >= 2) cnt += 2;
else cnt += 1;
}
List<Map.Entry<String, List<Integer>>> entrySet = new LinkedList<Map.Entry<String, List<Integer>>> (genresMap.entrySet());
Collections.sort(entrySet, new Comparator<Map.Entry<String, List<Integer>>>(){
@Override
public int compare(Map.Entry<String, List<Integer>> a, Map.Entry<String, List<Integer>> b) {
Integer aCnt = 0;
Integer bCnt = 0;
for (int aNum : a.getValue()) {
aCnt += plays[aNum];
}
for (int bNum : b.getValue()) {
bCnt += plays[bNum];
}
return Integer.compare(bCnt, aCnt);
}
});
int[] answer = new int[cnt];
int idx = 0;
for (Map.Entry<String, List<Integer>> entry : entrySet) {
List<Integer> list = entry.getValue();
Collections.sort(list, new Comparator<Integer>(){
@Override
public int compare (Integer a, Integer b) {
if (plays[a] == plays[b]) return 1;
return Integer.compare(plays[b], plays[a]);
}
});
answer[idx++] = list.get(0);
if (list.size() >= 2) {
answer[idx++] = list.get(1);
}
}
return answer;
}
}
4. 결과 및 회고
중간에 오타 때문에 삽질하는 부분이 생겼는데 정신 차리고 제대로 확인하면서 풀자.
'문제풀이 > 프로그래머스' 카테고리의 다른 글
[JAVA] 프로그래머스 - 롤케이크 자르기 (0) | 2023.05.11 |
---|---|
[JAVA] 프로그래머스 - 기지국 설치 (0) | 2023.05.10 |
[JAVA] 프로그래머스 - 소수 찾기 (0) | 2023.05.09 |
[JAVA] 프로그래머스 - 가장 큰 수 (0) | 2023.05.09 |
[JAVA] 프로그래머스 - 숫자 변환하기 (0) | 2023.05.09 |
댓글