Lv1-실패율

Dev StoryTeller·2020년 12월 12일
0

0. 문제

전체 스테이지의 개수 N, 게임을 이용하는 사용자가 현재 멈춰있는 스테이지의 번호가 담긴 배열 stages가 주어질 때, 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 return 하도록 solution 함수를 완성하라.

자세한 문제는 여기서 참조
(https://programmers.co.kr/learn/courses/30/lessons/42889)


1. 풀이

import java.util.*;

class Solution {
    public Integer[] solution(int N, int[] stages) {
        // 실패율을 담을 hashmap을 정의한다
        HashMap<Integer, Double> failMap = new HashMap<>();
        
        // 스테이지를 돈다(1스테이지부터 N스테이지까지)
        for(int i=1; i<N+1; i++) {
            // 실패율을 구하여 hashmap에 담는다
            // 실패율 = 클리어X/전체 플레이어
            int part_count = 0;
            int fail_count = 0;
            double fail = 0.00;
            // 사용자 배열을 돈다
            for(int j=0; j<stages.length; j++) {
                if(stages[j] >= i) {
                    part_count++;
                    if(stages[j] == i) {
                        fail_count++;
                    }
                }
            }
            if(part_count != 0) {
                fail = (double)fail_count/part_count;
            }
            failMap.put(i, fail);
        }
        
        // value를 역정렬한다
        // 우선 List로 반환
        ArrayList<Integer> answerList = new ArrayList<Integer>(failMap.keySet());
        // Comparator로 역정렬
        Collections.sort(answerList, (a, b) -> (failMap.get(b).compareTo(failMap.get(a))));
        
        // 다시 배열에 담음
        Integer[] answer = answerList.toArray(new Integer[0]);
        // 반환
        return answer;
    }
}

2. 설명

위 풀이는 사실 워낙 명백해서 설명할 것이 없다.
1~N 스테이지까지 돌면서, 사용자 배열의 참가자와 클리어 못한 사람들을 골라내는 완전 탐색 방법이다.

정렬로는 Collections.sort와 comparator를 이용하였다.


3. 결론

딱 봐도 알겠지만, 성능이 어마어마하게 구리다.
(수행시간이 최고 380ms를 찍었다..ㅇㅁㅇ)
생각의 흐름대로 작성한 거지만, 그렇게까지 나올 줄은 몰랐다.

아마 for문이 두개인 것람다식 compare를 이용한 것이 성능 저하의 원인이지 않을까 생각한다.

람다식은 생략해서 간편한 대신, 원래의 코드보다 조금 느리다는 단점이 있다.
이중 for문은 뭐 말할 것도 없고...

조금 더 찬찬히 생각해보며 코드를 수정해야할 것 같다.

profile
개발을 이야기하는 개발자입니다.

0개의 댓글