알고리즘 풀이 및 리뷰/프로그래머스
[240324] 알고리즘 리부트 37일차 - 프로그래머스 실패율 자바
앙갱
2024. 3. 24. 23:13
반응형
해시맵까지 잘 구현했는데 정렬하는 부분에서 꼬여버렸다. 아래 return문은 스트림 형식으로 추출해서 정렬하고 배열로 반환하는 방식이다.
import java.util.*;
class Solution {
public int[] solution(int N, int[] stages) {
int gamer = stages.length;
int [] cnt = new int [N+1];
for(int i : stages){
if(i<=N) cnt[i]++;
}
int [] acc = new int [N+1];
for(int i = 1; i<=N; i++){
acc[i] = acc[i-1]+cnt[i];
}
HashMap<Integer, Double> map = new HashMap<>();
for(int i = 1; i<=N; i++){
map.put(i, (gamer - acc[i - 1] == 0) ? 0 : (double) cnt[i] / (gamer - acc[i - 1]));
}
return map.entrySet().stream().sorted((o1,o2)->Double.compare(o2.getValue(), o1.getValue())).mapToInt(HashMap.Entry::getKey).toArray();
}
}
아래 코드는 위 코드가 한 눈에 들어오지 않는 경우를 위해 구현...한 것으로 실패율을 기준으로 내림차순 정렬한 스테이지가 들어갈 list 를 생성해서 처리한 방식이다. 일단 실패율을 기록한 map에 스테이지들을 먼저 기본으로 넣어준다. 그 다음 map의 값을 기준으로 내림차순 정렬해서 order list에 반영하도록 한다. 이를 다시 int 배열로 변환해준다. 재밌었다..
import java.util.*;
class Solution {
public int[] solution(int N, int[] stages) {
int gamer = stages.length;
int [] cnt = new int [N+1];
for(int i : stages){
if(i<=N) cnt[i]++;
}
int [] acc = new int [N+1];
for(int i = 1; i<=N; i++){
acc[i] = acc[i-1]+cnt[i];
}
HashMap<Integer, Double> map = new HashMap<>();
for(int i = 1; i<=N; i++){
map.put(i, (gamer - acc[i - 1] == 0) ? 0 : (double) cnt[i] / (gamer - acc[i - 1]));
}
List<Integer> order = new ArrayList<>(map.keySet());
Collections.sort(order, new Comparator<Integer>(){
@Override
public int compare(Integer o1, Integer o2){
return Double.compare(map.get(o2),map.get(o1));
}
});
return order.stream().mapToInt(Integer::intValue).toArray();
}
}
반응형