[JAVA] [LEVEL1] 프로그래머스 - 실패율

반응형

프로그래머스 programmers Level1 실패 - java

[문제]

2019 KAKAO BLIND RECRUITMENT

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

 

프로그래머스

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

programmers.co.kr

 

[풀이]

・실패율 = 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수

실패율을 계산하기 위해 각 스테이지에 도달한 플레이어 수가 필요하다.
각 스테이지에 도달했으나 클리어하지 못한 플레이어 수 / (전체 플레이어 수 - 전 스테이지까지의 플레이어 수)
그래서 각 스테이지별 플레이어 수와 전체 플레이어 수를 구해야한다.

  1. 유저수 구하기
    1.1. stages.length : stages 의 길이가 전체 유저수를 의미하므로 전체 유저수를 구한다.
    1.2. stageUser : 각 스테이지에 멈춰있는 유저의 수를 담는 배열을 선언한다.
          ※ 이때, 인덱스를 스테이지번호로 만들기위해 new int[N + 2] 로 생성해준다.

  2.  실패율 구하기
    2.1. Map<Integer, Double> failRatioMap : 각 스테이지 번호와 실패율을 담을 Map을 생성해준다.
          ※ key : 스테이지 번호, value : 실패율
    2.2. 다음과 같은 식으로 실패율을 계산하여 Map 에 넣어준다.
          stageUser[i] / (전체 플레이어 수 - i 스테이지까지 도달못한 플레이어 수의 합)

    예를들어 N=5, stages = [2, 1, 2, 6, 2, 4, 3, 3], result = [3,4,2,1,5] 일때
    stageUser = [0, 1, 3, 2, 1, 0, 1]
    1번 스테이지 실패율 : stageUser[1] / (8 - 0)
    2번 스테이지 실패율 : stageUser[2] / (8 - 1)
    3번 스테이지 실패율 : stageUser[3] / (8 - 4)
    ...
     이때 주의할점은 실패율을 계산할때의 분모 (전체 플레이어 수 - i 스테이지까지 도달못한 플레이어 수의 합) 가 0 이면 에러가 발생하므로 체크 필요하다.

  3. 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 리턴해야하므로 실패율(value)로 스테이지 번호(key)를 내림차순 정렬한다.

  4. 배열로 변환하여 리턴한다.

 

[java 코드]

import java.util.*;
import java.util.stream.*;
public int[] solution(int N, int[] stages) {
    int[] answer = new int[N];
    int userNumbers = stages.length; // 전체 유저수
    int[] stageUser = new int[N + 2]; // +2 로 유저수 인덱스화
    // 스테이지 유저 수
    for (int i = 0; i < userNumbers; i++) {
        stageUser[stages[i]]++;
    }

    // key : 스테이지 번호 , value : 실패율
    Map<Integer, Double> failRatioMap = new HashMap<>();
    // 실패율 배열
    int user = 0;
    for (int i = 1; i <= N; i++) {
        // 0 으로 나누면 에러 발생하므로 체크 필요
        if (userNumbers - user == 0) {
            failRatioMap.put(i, 0.0);
        } else {
            failRatioMap.put(i, (double) stageUser[i] / (userNumbers - user));
        }
        user += stageUser[i];
    }

    // value 값으로 key 내림차순 정렬
    List<Integer> keyList = new ArrayList<>(failRatioMap.keySet());
    Collections.sort(keyList, (o1, o2) -> (failRatioMap.get(o2).compareTo(failRatioMap.get(o1))));

    // 결과배열 설정
    int idx = 0;
    for (Integer key : keyList) {
        if (key <= N) {
            answer[idx] = key;
            idx++;
        }
    }
    return answer;
}

 

 

[채점 결과]

반응형