https://school.programmers.co.kr/learn/courses/30/lessons/42579#
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 풀이
문제를 잘 못 읽어 푸는데 오래 걸렸습니다.
1. 장르별 재생 횟수 모으기
2. 고유번호별 재생 횟수 모으기
3. 각각 내림차순 정렬
4. 각 장르별 최대 2개씩 넣기
5. 재생 횟수가 같다면 고유번호가 낮은 것부터
이걸 하면 됩니다.
내림차순 정렬 하고, 재생 횟수 * -1 을 해서 넣어주고 오름차순 정렬도 했습니다.
테스트 케이스 2, 15번이 틀린다면 무조건
장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.
라는 조건을 만족시키지 못해서입니다.
저 조건을 만족시키려고 temp list를 만들어서 비교했습니다.
import java.util.*;
class Solution {
public int[] solution(String[] genres, int[] plays) {
List<Integer> answer = new ArrayList<>();
Map<String, Integer> map = new HashMap<>(), musicMap = new HashMap<>();
for (int i = 0; i < genres.length; i++) {
map.put(genres[i], map.getOrDefault(genres[i],0)+plays[i]); // 장르별 재생 횟수 저장
musicMap.put(genres[i]+i, plays[i]*-1); // 노래 & 재생 횟수 저장
}
List<String> genresList = new ArrayList<>(map.keySet()), musicList = new ArrayList<>(musicMap.keySet());
genresList.sort((o1,o2)->map.get(o2).compareTo(map.get(o1))); // 장르별 재생 횟수 내림차순 정렬
musicList.sort(Comparator.comparing(musicMap::get));
for (int i = 0; i < genresList.size(); i++) {
int time = 0;
List<Integer> temp = new ArrayList<>();
for (int j = 0; j < musicList.size(); j++) {
if (musicList.get(j).contains(genresList.get(i))) {
answer.add(Integer.valueOf(musicList.get(j).replaceAll("\\D","")));
time++;
temp.add(musicMap.get(musicList.get(j)));
}
if (time == 2) {
if (Objects.equals(temp.get(0), temp.get(1))) {
int a = answer.get(answer.size()-1);
answer.set(answer.size()-1, answer.get(answer.size()-2));
answer.set(answer.size()-2, a);
}
break;
}
}
}
return answer.stream().mapToInt(i->i).toArray();
}
}
다른 분들 코드를 보면 class를 만들어서 구현하셨습니다.
그게 더 효율이 좋을 것입니다.
왜냐면 제 코드가 효율이 나쁩니다. 통과 못하는 줄~
안녕히계세요뿅~
'PS' 카테고리의 다른 글
[프로그래머스] 무인도여행 자바 풀이 (0) | 2023.04.17 |
---|---|
[프로그래머스] 달리기 경주 자바 풀이 (1) | 2023.04.15 |
[프로그래머스] 방문 길이 자바 풀이 (0) | 2023.04.02 |
[프로그래머스] 오픈채팅방 자바 풀이 (0) | 2023.03.25 |
[프로그래머스] n진수 게임 자바 풀이 (0) | 2023.03.23 |