배열을 다루는 문제이다. 간단하게 요약하면 배열에서 각 스테이지보다 더 전진한 유저수를 다 더하고 해당 스테이지에 머물고 있는 유저수를 세서 실패율을 구하고 실패율을 Sorting하면 완료된다.
이번에도 각 스테이지의 유저수를 핸들링하기 위해 클래스를 생성하였다. (지금 보니 클래스명이 Stage가 더 적절한거 같은데...)
class Score {
int endPlayer;
int nowPlayer;
Score(){
endPlayer = 0;
nowPlayer = 0;
}
}
Score 배열을 스테이지 수만큼 만들어주고 반복문을 통해 각 스테이지의 유저수를 카운팅해주었다.
double biggestRate = 0;
int index = 0;
for(int i = 0; i < N; i++) {
biggestRate = -1;
index = -1;
for(int j = 0; j < N; j++) {
if(check[j] == false && biggestRate < rate[j]) {
biggestRate = rate[j];
index = j;
}
}
answer[i] = index+1;
check[index] = true;
}
return answer;
이후 실패율을 계산하고 가장 큰 스테이지부터 answer 배열에 넣어주었다.
for(int i = 0; i < N; i++) {
scoreArr[i] = new Score();
}
/* 현재 플레이어 위치 카운팅 */
for(int i = 0; i < stages.length; i++){
if(stages[i]<N+1){
scoreArr[stages[i]-1].nowPlayer++;
}
else{
allClearPlayer++;
}
}
/* 스테이지에 도달한 플레이어 저장 */
for(int i = 0; i < N; i++) {
for(int j = i; j < N; j++) {
scoreArr[i].endPlayer += scoreArr[j].nowPlayer;
}
scoreArr[i].endPlayer += allClearPlayer;
if(scoreArr[i].endPlayer == 0) {
rate[i] = 0;
}
else {
rate[i] = (double)scoreArr[i].nowPlayer / scoreArr[i].endPlayer;
}
}
이번 문제도 쉬운 문제였다. 다만 N+1 스테이지 라던가 스테이지에 도달한 유저가 없는 경우 실패율을 0으로 정의하는 등 여러 제한사항을 놓치면 안된다.
아래는 코드 전문이다.
import java.util.*;
class Solution {
public int[] solution(int N, int[] stages) {
int[] answer = new int[N];
Score[] scoreArr = new Score[N];
int allClearPlayer = 0;
double[] rate = new double[N];
boolean[] check = new boolean[N];
Arrays.fill(check, false);
for(int i = 0; i < N; i++) {
scoreArr[i] = new Score();
}
/* 현재 플레이어 위치 카운팅 */
for(int i = 0; i < stages.length; i++){
if(stages[i]<N+1){
scoreArr[stages[i]-1].nowPlayer++;
}
else{
allClearPlayer++;
}
}
/* 스테이지에 도달한 플레이어 저장 */
for(int i = 0; i < N; i++) {
for(int j = i; j < N; j++) {
scoreArr[i].endPlayer += scoreArr[j].nowPlayer;
}
scoreArr[i].endPlayer += allClearPlayer;
if(scoreArr[i].endPlayer == 0) {
rate[i] = 0;
}
else {
rate[i] = (double)scoreArr[i].nowPlayer / scoreArr[i].endPlayer;
}
}
double biggestRate = 0;
int index = 0;
for(int i = 0; i < N; i++) {
biggestRate = -1;
index = -1;
for(int j = 0; j < N; j++) {
if(check[j] == false && biggestRate < rate[j]) {
biggestRate = rate[j];
index = j;
}
}
answer[i] = index+1;
check[index] = true;
}
return answer;
}
}
class Score {
int endPlayer;
int nowPlayer;
Score(){
endPlayer = 0;
nowPlayer = 0;
}
}
댓글