algorithm/programmers

[프로그래머스/자바] 실패율 풀이 - 2019 KAKAO BLIND RECRUITMENT

hsm914 2022. 11. 24. 18:19
728x90

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2019 KAKAO BLIND RECRUITMENT Level 1 문제다.

 

 

 

스테이지별로 몇명의 사용자가 도전했는지(fail[i][1]), 몇명의 사용자가 아직 클리어하지 못했는지(users[i]) 저장할 배열을 만든다.

 

현재 어떤 사용자가 4 스테이지에 있다면, 이미 1, 2, 3 스테이지를 거쳐간 것이다.

이를 활용해서 stages의 원소 하나하나 탐색해 가며

fail 배열의 1~stages[i]의 인덱스를 1씩 더하고,

stages[i]는 아직 그 단계를 클리어하지 못하고 머물러있다는 뜻이므로 users 배열을 1더한다.

 

fail[i][0]에는 스테이지 번호가 담겨져 있다.

users[i] / fail[i][1]의 결과가 i 스테이지의 실패율이 되므로,

2차원 배열 fail을 Comparator를 통해 실패율 내림차순, 스테이지 번호 오름차순으로 정렬하면 된다.

그리고 정렬했을 때 fail[i][0], 스테이지 번호만 담겨있는 것을 반환한다.

 

 

배운점 및 느낀점

Arrays.sort 하는 과정에서 double을 o1[1] == o2[1] 과 같이 비교하면 오류가 떴다.

그래서 double이 아니라 int로 fail 배열을 바꾸고,

실패율을 구하는 과정에서 * 100000을 해 소숫점을 위로 올렸다.

하지만 double의 소숫점 정확성이 떨어지기 때문에 몇몇 테케에서 오류가 났고,

다시 fail 배열을 double로 변경하고 Double.compare를 통해 실패율을 비교했다.

Double.compare이 곧바로 생각나지 않았는데, 이번기회에 다시 상기시켰다.

 

그리고 for문을 통해 1~stages[i]까지 돌고 1씩 더하는 과정에서

시간이 좀 걸리는 것 같다.

다음엔 comparable 를 implements한 클래스를 직접 생성해서 구현하는 것도 나쁘지 않을 것 같다.

 

import java.util.*;

class Solution {
    public int[] solution(int N, int[] stages) {
        double[][] fail = new double[N][2]; // 스테이지 번호, 실패율
        int[] users = new int[N]; // 클리어하지 못한 사용자 수
        
        for(int i=0;i<N;i++)
            fail[i][0] = i;
        
        for(int i=0;i<stages.length;i++) {
            int st = stages[i] - 1;
            
            if(st != N)
                users[st]++;
            
            // 스테이지에 도전한 사용자
            for(int j=0;j<=st;j++)
                if(j != N)
                    fail[j][1]++;
        }
        
        // 실패율 계산
        for(int i=0;i<N;i++) {
            if(fail[i][1] == 0)
                continue;
            fail[i][1] = users[i] / fail[i][1];
        }
        
        Arrays.sort(fail, (o1, o2) -> 
        Double.compare(o1[1], o2[1]) == 0 ? 
        		Double.compare(o1[0], o2[0]) : Double.compare(o2[1], o1[1]));
        
        int[] ans = new int[N];
        
        for(int i=0;i<N;i++)
            ans[i] = (int)(fail[i][0] + 1);
        
        return ans;
    }
}
728x90