프로그래머스 실패율 문제 풀이를 진행하였습니다.
문제를 읽으면 아래와 같은 해석이 가능합니다.
게임의 스테이지 갯수와 플레이어가 게임을 플레이하여 도달한 위치값이 주어집니다.
각 스테이지별로 실패율을 구하고 실패율이 높은 스테이지부터 내림차순으로 정렬 후 return해야 합니다.
새로운 배열에 index스테이지까지 도달한 플레이어의 수를 차례대로 저장해줍니다.
이후 또 다른 배열에 실패율을 입력해주고 정렬하면 되는데 각 스테이지의 실패율은 (스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수)로 계산이 가능하며 이를 가지고 내림차순으로 정렬하면 답을 구할 수 있습니다.
import java.util.*;
class Solution {
public int[] solution(int N, int[] stages) {
int[] answer = new int[N];
float[] stageSuccessRate = new float[N+2];
int[] stageSuccessCount = new int[N+2];
Integer[] result = new Integer[N];
int playerNum;
//스테이지 승리 횟수 저장
for(int i = 0; i < stages.length; i++)
{
stageSuccessCount[stages[i]]++;
}
playerNum = stages.length; //전체 플레이어 수
//스테이지의 실패율 계산
for(int i = 1; i < N+1; i++)
{
result[i-1] = i;
if(stageSuccessCount[i] > 0)
{
stageSuccessRate[i] = (float)stageSuccessCount[i] / (float)playerNum;
playerNum -= stageSuccessCount[i];
}
}
//실패율을 기준으로 내림차순 정렬
Arrays.sort(result, new Comparator<Integer>() {
@Override
public int compare(Integer i1, Integer i2) {
if(stageSuccessRate[i2] - stageSuccessRate[i1] == 0 && i2 > i1) //승률이 낮으면 스테이지가 적은 곳으로
return -1;
if(stageSuccessRate[i2] - stageSuccessRate[i1] < 0)
return -1;
else
return 1;
}
});
for(int i = 0; i < N; i++)
{
answer[i] = result[i];
}
return answer;
}
}
출저
https://school.programmers.co.kr/learn/courses/30/lessons/92334