mondegreen

[240324] 알고리즘 리부트 37일차 - 프로그래머스 실패율 자바 본문

알고리즘 풀이 및 리뷰/프로그래머스

[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();
    }
}
반응형