본문 바로가기

프로그래머스 풀이

프로그래머스 2단계 - 실패율(Java)

깃허브:

https://github.com/MSIQOC/Programmers/blob/main/%EC%8B%A4%ED%8C%A8%EC%9C%A8.java

 

https://programmers.co.kr/learn/courses/30/lessons/42889

 

코딩테스트 연습 - 실패율

실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스

programmers.co.kr

먼저 stages를 오름차순으로 정렬하면 각 스테이지마다 도전자 수를 알 수 있다. 포인터 p를 두고 각 스테이지마다 도전자 수를 구해서 확률을 구하고 해쉬맵에 스테이지를 키로 하고 확률을 value로 해서 넣는다. 그러고 나서 hashmap을 value 기준 내림차순, key 기준 오름차순으로 정렬하면 된다.

 

https://softworking.tistory.com/84

 

[프로그래머스][2019 KAKAO BLIND RECRUITMENT] 실패율 (level 1)

https://programmers.co.kr/learn/courses/30/lessons/42889 코딩테스트 연습 - 실패율 | 프로그래머스 실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요.

softworking.tistory.com

value를 기준으로 내림차순 정렬하고 key를 기준으로 오름차순 정렬이 되도록 override 해주는 방법은 잘 모르겠어서 블로그를 참고했다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import java.util.*;
import java.util.Map.*;
class Solution {
    public int[] solution(int n, int[] stages) {
        HashMap<Integer, Double> hm = new HashMap<>();   
        //1. stages를 오름차순으로 정렬시키기
        Arrays.sort(stages);
        
        //2. 이중에서 도전자 수 구하기.
        int p = 0;
        int num = stages.length;
        for(int i=1; i<=n; ++i){
            int howmany = 0;
            while(p < stages.length && stages[p] <= i){
                ++howmany;
                ++p;
            }
            double nn = (double) howmany/num;
            hm.put(i, nn);
            num -= howmany;
        }
         // 순서 유지를 위해 링크드 리스트
        List<Map.Entry<Integer, Double>> list = new LinkedList<>(hm.entrySet());
 
        // value기준 내림차순, 인덱스 기준 오름차순 정렬
        Collections.sort(list, new Comparator<Map.Entry<Integer, Double>>() {
            @Override
            public int compare(Entry<Integer, Double> o1, Entry<Integer, Double> o2) {
                if (o2.getValue() - o1.getValue() > 0) {
                    return 1;
                }
                if (o2.getValue() - o1.getValue() < 0) {
                    return -1;
                }
                return o1.getKey() - o2.getKey();
            }
        });
        int[] answer = new int[n];
        int i = 0;
        
        // 배열에 순서대로 인덱스 담기
        for (Iterator<Map.Entry<Integer, Double>> iter = list.iterator(); iter.hasNext();) {
            Map.Entry<Integer, Double> entry = iter.next();
            answer[i++= entry.getKey();
        }
        return answer;
    }
}
cs