해당 문제는 각 스테이지별 머물고 있는 유저의 수를 해시 맵에 넣은 후, 1스테이지부터 N 스테이지까지의 반복문을 돌며 해당 스테이지에 머무르고 있는 유저의 수를 맵에서 꺼내는 방식으로 구현했습니다. N스테이지에 도달한 유저의수는 이전 스테이지에 머문 유저의 수를 뺀 값으로 구하도록 했습니다.
이 후 이 정보를 바탕으로 실패율이 높은 순으로 내림차순, 스테이 번호로 오름 차순 정렬하도록 Comparator를 구현해 정렬 하였습니다
public int[] solution(int N, int[] stages) {
int passUser = stages.length;
Map<Integer, Integer> stageMap = new HashMap<>();
List<StageInfo> stageInfoList = new ArrayList<>();
for(int stage : stages) {
stageMap.put(stage, stageMap.getOrDefault(stage, 0) + 1);
}
for(int i = 1; i <= N; i++) {
Integer currentUser = stageMap.getOrDefault(i, 0);
StageInfo stageInfo = new StageInfo(i, passUser, currentUser);
passUser -= currentUser;
stageInfoList.add(stageInfo);
}
stageInfoList.sort((o1, o2) -> {
if(o1.getFailRate() < o2.getFailRate()) {
return 1;
} else if(o1.getFailRate() == o2.getFailRate()) {
return o1.getStage() > o2.getStage() ? 1 : -1;
} else {
return -1;
}
});
return stageInfoList.stream().mapToInt(StageInfo::getStage).toArray();
}
private class StageInfo {
private Integer stage;
private Integer passUser;
private Integer currentUser;
public StageInfo(Integer stage, Integer passUser, Integer currentUser) {
this.stage = stage;
this.passUser = passUser;
this.currentUser = currentUser;
}
public Integer getStage() {
return stage;
}
public double getFailRate() {
return passUser > 0 ? (double) currentUser/ passUser : 0;
}
}
'정리 > 알고리즘' 카테고리의 다른 글
프로그래머스 - [1차] 뉴스 클러스터링 (0) | 2022.04.13 |
---|---|
프로그래머스 - 괄호 변환 (0) | 2022.04.13 |
프로그래머스 - 메뉴 리뉴얼 (0) | 2022.04.08 |
프로그래머스 - 짝지어 제거하기 (0) | 2022.04.07 |
프로그래머스 - 124 나라의 숫자 (0) | 2022.04.06 |
댓글