문제를 읽고 어떻게 구현해야 할지 한참 고민했다.
각 스테이지의 번호와 실패율을 같이 저장하는 게 좋아 보여서 Map을 이용해야겠다는 생각을 했다.
실패율은 각 스테이지에 도전 중인 플레이어 수 / 클리어한 플레이어 수로 계산하게 된다.
각 스테이지에 도전중인 플레이어 수를 구하는 것은 문제가 없었는데 클리어한 플레이어 수를 구하는데 애를 먹었다.
한참 고민끝에 Collections.frequency를 이용해서 플레이어 숫자를 구하고 리스트에서 지우는 방법을 선택했다.
그렇게 실패율을 구해서 Map에 넣고 compareTo를 이용해서 값을 내림차순 정렬했다.
그런데 테스트 케이스 1, 6, 7, 9, 13, 23, 24, 25에서 실패로 나왔다........
한참을 고민해도 모르겠어서 질문하기 탭을 보니 0을 0으로 나누는 경우를 예외처리를 해줘야 한다고 했다.
확인해 보니 스테이지에 도달하지 못한 플레이어 수가 0이고 리스트의 사이즈도 0이면 0을 0으로 나누게 되어 NaN가 발생하는 것이었다.
그 경우를 생각해서 수정하니 모든 케이스를 통과했다.
문제를 풀긴 했지만 시간이 너무 오래 걸렸다.
더 연습하자!
최종 답안
import java.util.*;
class Solution {
public int[] solution(int N, int[] stages) {
int[] answer = new int[N];
// 배열 리스트로 옮기기
List<Integer> list = new ArrayList();
for (int i : stages) {
list.add(i);
}
// 실패율을 구하기 위한 맵
Map<Integer, Double> map = new HashMap();
// 스테이지 개수만큼 반복
for (int i = 1; i <= N; i++) {
int cnt = 0;
// 리스트의 사이즈
int s = list.size();
for (int j = 0; j < list.size(); j++) {
if(i == list.get(j)) {
// 각 스테이지에 있는 플레이어 숫자 구하기
cnt = Collections.frequency(list, i);
// 계산된 플레이어 삭제
list.removeAll(Collections.singleton(list.get(j)));
}
}
// 실패율 계산
double fail = (double)cnt / s;
// 0 / 0 예외처리
if (cnt == 0 && s == 0) {
fail = 0.0;
}
// 맵에 스테이지 정보와 실패율 추가
map.put(i, fail);
}
// 맵을 값으로 내림차순 정렬
List<Integer> keyList = new ArrayList<>(map.keySet());
Collections.sort(keyList, (o1, o2) -> (map.get(o2).compareTo(map.get(o1))));
// 맵의 키값 정답으로 출력
for (int i=0; i<keyList.size(); i++) {
answer[i] = keyList.get(i);
}
return answer;
}
}
'코딩 테스트' 카테고리의 다른 글
(Java) 프로그래머스 숫자 문자열과 영단어 (0) | 2021.11.27 |
---|---|
(Java) 프로그래머스 폰켓몬 (0) | 2021.11.24 |
(Java) 프로그래머스 약수의 개수와 덧셈 (0) | 2021.11.20 |
(Java) 프로그래머스 3진법 뒤집기 (0) | 2021.11.15 |
(Java) 문자열 p와 y의 개수 (0) | 2021.11.13 |