반응형
개념적인 측면에서 머릿속으로 계산하려니까 계속 어디선가 꼬였다..
lastStages[] 배열은 현재 못풀고 못넘어가고있는단계.
nStagePlayers 는 index값을 맞춰주기 위해 N+2 사이즈로 생성.
failure(실패율) =
nStagePlayers[id](해당 단계에 멈춰있는 중인 인원) / remainPlayers(다음스테이지로갈때마다 줄어듦)
위 부분을 계속해서 머릿속에서 꼬여서 못풀었다. 전혀 못풀 문제가 아닌데..내가 "stage에 머물러있는사람"이 된 기분이었다.. 다음스테이지로 갈때마다 "lastStages.length -= 현재단계에 머무는사람 수"를 시행하면 된다는 것을 명심하자.
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class Solution {
public int[] solution(int N, int[] lastStages) {
int nPlayers = lastStages.length;
int[] nStagePlayers = new int[N + 2];
for (int stage : lastStages) {
nStagePlayers[stage] += 1;
}
int remainingPlayers = nPlayers;
List<Stage> stages = new ArrayList<>();
for (int id = 1 ; id <= N; id++) {
double failure = (double) nStagePlayers[id] / remainingPlayers;
//다음단계도전자= 현재스테이지 못푼사람 빼주기
remainingPlayers -= nStagePlayers[id];
Stage s = new Stage(id, failure);
stages.add(s);
}
Collections.sort(stages); //Comparble 메소드 @Override내림차순 정렬.
int[] answer = new int[N];
for (int i = 0; i < N; i++) {
answer[i] = stages.get(i).id;
}
return answer;
}
class Stage implements Comparable<Stage> {
public int id;
public double failure;
public Stage(int id_, double failure_) {
id = id_;
failure = failure_;
}
@Override
public int compareTo(Stage o) {
if (failure > o.failure ) {
return -1;
}
if (failure < o.failure ) {
return 1;
}
return 0;
}
}
}
id값을 필자는 해쉬셋(HashSet)을 이용해서 정렬하고 인덱스값을 출력하려고 했다.
하지만, 위 코더는 객체를 생성해서 Comparble메소드를 이용해 failure 값으로 정렬하고,
id(인덱스)값을 내림차순 순서대로 출력하는 방식을 적용했다.
개인적으로, 이 방식이 더 익숙해서 쉬운것같다.
객체를 이용해서 인덱스값 추출(출력)을 하는 방식을 잘 활용해야겠다.
반응형
'코딩테스트 > Java' 카테고리의 다른 글
(2018 카카오) [1차] 비밀지도 Java (0) | 2020.12.28 |
---|---|
(2019 카카오) 키패드 누르기 Java (0) | 2020.12.23 |
(2019 카카오)크레인 인형뽑기 게임 Java (0) | 2020.12.18 |
[JAVA] 백준 "단지번호붙이기" (0) | 2020.12.03 |
[JAVA] 백준 "바이러스" (0) | 2020.12.03 |