반응형
프로그래머스 programmers Level1 실패 - java
[문제]
2019 KAKAO BLIND RECRUITMENT
https://school.programmers.co.kr/learn/courses/30/lessons/42889
[풀이]
・실패율 = 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수
실패율을 계산하기 위해 각 스테이지에 도달한 플레이어 수가 필요하다.
각 스테이지에 도달했으나 클리어하지 못한 플레이어 수 / (전체 플레이어 수 - 전 스테이지까지의 플레이어 수)
그래서 각 스테이지별 플레이어 수와 전체 플레이어 수를 구해야한다.
- 유저수 구하기
1.1. stages.length : stages 의 길이가 전체 유저수를 의미하므로 전체 유저수를 구한다.
1.2. stageUser : 각 스테이지에 멈춰있는 유저의 수를 담는 배열을 선언한다.
※ 이때, 인덱스를 스테이지번호로 만들기위해 new int[N + 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 이면 에러가 발생하므로 체크 필요하다. - 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 리턴해야하므로 실패율(value)로 스테이지 번호(key)를 내림차순 정렬한다.
- 배열로 변환하여 리턴한다.
[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;
}
[채점 결과]
반응형