1. 문제 풀이 아이디어
- 역순으로 누적합을 구한 후, 실패율을 계산하여 이를 이차원 배열에 저장한 후, 배열을 정렬하면 문제를 해결할 수 있다.
2. 나의 정답 코드
class Solution {
public int[] solution(int N, int[] stages) {
int[] answer = new int[N];
int[] p = new int[N + 1];
int[] sum = new int[N + 1];
double[][] fails = new double[N][2];
for (int stage : stages) {
if (stage > N)
p[N]++;
else
p[stage - 1]++;
}
sum[N] = p[N];
for (int i = N - 1; i >= 0; i--) {
sum[i] = sum[i + 1] + p[i];
}
for (int i = 0; i < N; i++) {
fails[i][0] = sum[i] == 0 ? 0 : (double) p[i] / sum[i];
fails[i][1] = i;
}
Arrays.sort(fails, ((o1, o2) -> {
if (o1[0] == o2[0])
return Double.compare(o1[1], o2[1]);
return Double.compare(o2[0], o1[0]);
}));
for (int i = 0; i < N; i++) {
answer[i] = (int) fails[i][1] + 1;
}
return answer;
}
}
3. 정리
p
배열에 각 스테이지에 도달한 플레이어 수를 저장하고,N
이상의 스테이지에 도달한 플레이어는p[N]
에 저장한다.
sum
배열에 각 스테이지에 도달한 총 플레이어의 수를 누적해서 저장한다.
fails
2차원 배열에 첫 번째 원소에는 실패율을 저장하고, 두 번째 원소에는 해당 스테이지 번호를 저장한다.
- 실패율을 계산할 때,
0
으로 나누는 오류를 처리해줘야 한다.
Arrays.sort
메서드에 람다식을 사용하여 실패율을 내림차순으로 정렬하고, 실패율이 동일하면 스테이지 번호를 오름차순으로 정렬한다.
fails[i][1]
배열의 스테이지 번호를answer
배열에1
을 더한 후int
형으로 바꾸어 저장한다.
Share article