본문 바로가기

알고리즘 문제풀이/프로그래머스 Level 1

[2019 KAKAO BLIND RECRUITMENT/Java] 실패율

# 문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/42889

 

프로그래머스

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

programmers.co.kr

 

목차

 

카카오 문제 해설    2019 카카오 신입 공채 1차 코딩 테스트 문제 해설 링크
더보기

먼저 주어진 배열의 길이를 이용하여 전체 사용자 수를 구하고, 

stages 를 순회하며 각 스테이지에 몇 명의 사용자가 도달했는지 세줍니다.

이렇게 만들어둔 배열(각 스테이지별 사용자 수가 들어있는)을 순회하면서 stages 를 참고하여 스테이지별 실패율을 계산합니다.

이때, 스테이지에 도달한 사용자가 0명인 경우 예외 처리를 해야 합니다.

스테이지별 실패율을 구했다면, 각 스테이지 번호와 묶어서 실패율 내림차순으로 정렬합니다.

실패율이 같은 경우는 스테이지 번호가 작은 것을 먼저 오도록 정렬하면 됩니다.

 

프로그래머스 다른사람 풀이 참고 1 (오진영 , 종헌 , iseguswns@gmail.com , zeroempty2 외 2 명 / 링크)
class Solution {
    public int[] solution(int N, int[] stages) {
        int[] answer = new int[N];
        double[] tempArr = new double[N];
        int arrLength = stages.length;
        int idx = arrLength; // 전체 플레이어 수 => 1번째 스테이지에 도달한 플레이어 수
        
        // 1. 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 초기화
        for (int stage : stages) {
            if (stage != N + 1)
                answer[stage - 1] += 1;
        }
        
        // 2. 
        for (int i = 0; i < N; i++) {
            int personNum = answer[i]; // 현재(i번째) 스테이지에 도달했지만 아직 클리하지 못한 플레이어의 수
            tempArr[i] = (double) personNum / idx; // 실패율 계산
            idx -= personNum; // "다음(i+1번째) 스테이지에 도달한 플레이어 수"를 구하기 위해 "현재(i번째) 스테이지에 도달했지만 아직 클리하지 못한 플레이어의 수"만큼 빼준다.
            answer[i] = i + 1; // 스테이지 번호(인덱스) 초기화
        }
        
        // 3. 실패율 배열(tempArr[])과 스테이지 번호(인덱스) 배열(answer[]) 정렬 - 실패율 배열의 값으로 내림차수
        double tempD = 0;
        int tempI = 0;
        for (int i = 0; i < N; i++) {
            for (int j = 1; j < N - i; j++) {
                if (tempArr[j - 1] < tempArr[j]) {
                    tempD = tempArr[j - 1];
                    tempArr[j - 1] = tempArr[j];
                    tempArr[j] = tempD;

                    tempI = answer[j - 1];
                    answer[j - 1] = answer[j];
                    answer[j] = tempI;
                }
            }
        }
        return answer;
    }
}

다른사람 풀이 보고 사알짝 수정하고 주석 달아보았다~~

 

프로그래머스 다른사람 풀이 참고 2 (Collections.sort) (허현 / 링크)
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

class Solution {
    public int[] solution(int N, int[] lastStages) {
        int nPlayers = lastStages.length;
        int[] nStagePlayers = new int[N + 2];
        for (int stage : lastStages) {
            nStagePlayers[stage] += 1;
        }

        int remainingPlayers = nPlayers;
        List stages = new ArrayList<>();
        for (int id = 1 ; id <= N; id++) {
            double failure = (double) nStagePlayers[id] / remainingPlayers;
            remainingPlayers -= nStagePlayers[id];

            Stage s = new Stage(id, failure);
            stages.add(s);
        }
        Collections.sort(stages, Collections.reverseOrder());

        int[] answer = new int[N];
        for (int i = 0; i < N; i++) {
            answer[i] = stages.get(i).id;
        }
        return answer;
    }

    class Stage implements Comparable {
        public int id;
        public double failure;

        public Stage(int id_, double failure_) {
            id = id_;
            failure = failure_;
        }

        @Override
        public int compareTo(Stage o) {
            if (failure < o.failure ) {
                return -1;
            }
            if (failure > o.failure ) {
                return 1;
            }
            return 0;
        }
    }
}

Comparable인터페이스를 구현하는 class를 정의하고

Comparable인터페이스의 compareTo 메서드를 정의해서 sorting에 활용

 

방식 잘 봐두자!!!

참고하기: https://gmlwjd9405.github.io/2018/09/06/java-comparable-and-comparator.html

 

[Java] Comparable와 Comparator의 차이와 사용법 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io