문제 설명
입출력 예시
요약
실패율 = 아직 클리어하지 못한 플레이어 수 / 도전한 인원
풀이
문제 해석
실패율이 높은 순서대로(서로 같은 스테이지가 있다면 스테이지 순서대로) return
접근 방식
1. 도전 인원 map 구성
→ 1번 스테이지 도전인원: stages.length, 나머지 스테이지: 이전 스테이지의 도전인원 - 실패인원
2. 실패율이 같은 경우 스테이지 순서대로 담기
→ Queue 형식으로 객체를 꺼내 조회하면서 stream().anyMatch() 메소드를 통해 가장 작은 스테이지인지 추가로 확인
코드리뷰
import java.util.*;
class Solution {
class FailRate { // 실패율과 스테이지를 담을 객체 클래스
double rate;
int stage;
public FailRate(int stage, double rate) {
this.rate = rate;
this.stage = stage;
}
}
public int[] solution(int N, int[] stages) {
HashMap<Integer, Integer> map1 = new HashMap<>(); // 실패인원 map
HashMap<Integer, Integer> map2 = new HashMap<>(); // 도전인원 map
List<FailRate> list = new ArrayList<>();
List<Integer> answerList = new ArrayList<>();
for(int i = 1; i <= N; i++) {
map1.put(i, 0); // 실패한 인원이 없을 경우를 대비해서 0으로 초기화
}
for(int i = 0; i < stages.length; i++) {
map1.put(stages[i], map1.getOrDefault(stages[i], 0) + 1);
}
for(int i = 0; i < map1.size(); i++) {
if(i == 0) {
map2.put(i+1, stages.length); // 첫 번째 스테이지의 도전인원
} else {
map2.put(i+1, map2.get(i) - map1.get(i)); // 각 스테이지 도전인원: 이전 스테이지 도전인원 - 실패인원
}
}
for(int i = 1; i <= N; i++) {
FailRate obj;
if(map1.get(i) == 0 && map2.get(i) == 0) {
obj = new FailRate(i, (double)0); // 도전인원과 실패인원 모두 0일 경우
} else {
obj = new FailRate(i, (double)map1.get(i)/map2.get(i)); // 실패율 객체 생성
}
list.add(obj); // 실패율 리스트에 담기
}
while(!list.isEmpty()) {
FailRate objOut = list.remove(0); // 첫 번째 요소 꺼내서
if(list.stream().anyMatch(others -> others.rate > objOut.rate)) { // 실패율이 더 큰 요소가 있으면
list.add(objOut); // 맨뒤에 다시 넣는다.
} else {
if(list.stream().anyMatch(others -> (others.rate == objOut.rate) && (others.stage < objOut.stage))) {
list.add(objOut); // 실패율이 같은 요소 중에 스테이지가 빠른 요소가 있다면 맨뒤에 다시 넣는다.
} else {
answerList.add(objOut.stage); // 모두 아니라면 꺼낸 객체의 스테이지를 answerList에 담는다.
}
}
}
System.out.println(answerList);
int[] answer = new int[answerList.size()];
for(int i = 0; i < answer.length; i++) {
answer[i] = answerList.get(i);
}
return answer;
}
}
'알고리즘 > PROGRAMMERS' 카테고리의 다른 글
전화번호 목록(Lv.2) (0) | 2024.03.22 |
---|---|
타겟 넘버(Lv.2) (0) | 2024.03.22 |
다트 게임(Lv.1) (0) | 2024.03.22 |
체육복(Lv.1) (0) | 2024.03.21 |
완주하지 못한 선수(Lv.1) (0) | 2024.03.21 |