자바 초급문제로 맨땅에 해딩하기

자바 초급문제 13-4. 실패율 완성.

Jungsoomin :) 2020. 4. 13. 23:02

프로그래머스(https://programmers.co.kr/learn/courses/30/lessons/42889)

자바 초급 문제의 2019 KAKAO BLIND RECRUITMENT안의 실패율이다.

 

list째로 sort해서 그 stage값을 answer에 넘겨주고 싶어서 Collections.sort()메서드의 Comparpator를 implements하여

CompareTo메서드를 오버라이딩했다. sort 시의 기준점을 바꿔놓은 것이다.

 

sort의 기준점을 잡아준 것인데 기존 인자보다 들어온 인자의 failRate가 높다면 양수를 리턴시켜서 앞으로 넘겨놓았다.

 

리스트에 넣을때부터 스테이지 순차로 되어있었기 때문에 그 이후에 다른 기준은 잡아 줄 필요가 없었다.

 

그 후에 for문을 돌려서 list.get(i).stage를 answer[i]에 넘겨주고 답을 리턴시켰다.

 

전에 손보다 말았던 실패율을 건드리고나서 이렇게 다시 로직을 엎고 sort 메서드를 오버라딩해보니까 과정에서 경험을 얻었다는 생각에 감사한 마음이 들었다. 그리고 남겨놓은 것을 매듭지어서 마음이 놓인다.

 

시간이 남게되는 때에 다시 타이핑해보며 코드를 짜내려가 볼 생각이다.

 

 

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package _2019KAKAO_BLIND_RECRUITMENT_실패율;
 
import java.util.*;
 
public class subClass1 {
    public int[] solution(int N, int[] stages) {
        int[] answer = {};
        // n은 스테이지 개수 , stages는 각 유저들이 머무는 스테이지 , stages의 길이는 유저의 수 , 실패율은 머무는사람 / 도달한
        // 플레이어 의 수
        // 실패율 순으로 내림차순, 실패율이 같을 경우 스테이지대로 오름차순 아무도 도달 못했을경우 실패율은 0.
        ArrayList<check> list = new ArrayList<check>();
 
        Arrays.sort(stages);
        // 스테이지 기준으로 유저들의 정보를 파악해야함.
        for (int i = 1; i <= N; i++) {// i 는 스테이지
            int User = 0;
            int Success = 0;// <<<도전 자
            for (int j = 0; j < stages.length; j++) {// 유저들을 조사해야함
                if (i == stages[j]) {
                    User += 1;
                }
                if (i <= stages[j]) {// 스테이지 수 보다 크다면
                    Success += 1;
                }
                User += 0;
                Success += 0;
            }
            double failR = (double) User / Success;
            if (User == 0 && Success == 0) {
                failR = 0;// 아무도 도달못했다면
            } else if (User == 0 && Success != 0) {
                failR = 0;// 다 성공했다면
            }
 
            // failR = (double)User/Success;//실패율 계산
            list.add(new check(i, failR));// 하나의 스테이지 당 하나의 실패율 계산
        }
 
        Collections.sort(list);// 오버라이딩 된 Collections.sort
        answer = new int[list.size()];// list만큼 확장
        for (int i = 0; i < list.size(); i++) {
            answer[i] = list.get(i).stage;// answer의 i에 list.get(i)의 stage를 대입
        }
 
        //
        return answer;
 
    }
 
    public class check implements Comparable<check> {// Comparable check 타입
        int stage;// 스테이지
        double failRate;// 실패율
 
        public check(int stage, double failRate) {// 생성자
            this.stage = stage;
            this.failRate = failRate;
        }
 
        @Override
        public int compareTo(check o) {// 오버라이딩
            if (this.failRate < o.failRate)
                return 1;// 들어온 인지값의 실패율이 더 높으면 자리 교체
            else if (this.failRate == o.failRate)
                return 0;
            else
                return -1;// 아니면 넣어진대로 , 즉 스테이지 대로 나열
        }
 
    }
 
}
 
cs