https://school.programmers.co.kr/learn/courses/30/lessons/42889
Level1, 58% 정답률 문제입니다.
문제 간단 설명
이 문제를 간단하게 설명하자면 다음과 같습니다.
예시를 이용해서 설명하겠습니다.
N(스테이지 수) = 5, stages[](사용자가 멈춰있는 스테이지의 번호) = {2, 1, 2, 6, 2, 4, 3, 3}
이 경우에 stages[]에서 1의 개수를 찾아보면 1개, 2의 개수는 3개 ... 5의 개수는 0개, 6의 개수는 1개입니다.
이 말은 즉, 스테이지 번호에서 멈춘 사람의 수를 의미합니다.
1번 스테이지에서 멈춘 유저는 1명 / 2번 스테이지에서 멈춘 유저는 3명 / ... / 5번 스테이지에서 멈춘 유저는 0명 / 모두 클리어한 유저는 1명이라는 뜻입니다.
유저의 수는 stages[]의 길이이고 위에 예시에서는 8명이므로, 각 스테이지 별 실패율은 다음과 같습니다.
{1번 스테이지 실패율 : 1/8}, {2번 스테이지 실패율 : 3/7 (1번에서 한 명이 실패했으니 -1을 해줘야함)} ... {5번 스테이지 실패율 : 0/1}
문제 감이 잡히셨나요?
문제 접근 방법 및 풀이
문제를 접근하기 위해서 저는 아래와 같은 순서로 풀어야겠다고 생각했습니다.
1. 스테이지 별로 실패한 유저의 수를 구한다.
2. 스테이지 별로 실패율을 구한다.
3. 스테이지의 실패율을 내림차순으로 정렬한다.
4. 정답으로 리턴한다.
이렇게 풀기 위해서 Key:Value(스테이지 : 유저 혹은 실패율) HashMap을 사용했습니다.
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Solution {
static public List<Integer> solution(int n, int[] stages) {
HashMap<Integer, Integer> stageFailureCountMap = new HashMap<>();
HashMap<Integer, Double> stageFailureMap = new HashMap<>();
// 0. 초기화
for (int i = 1; i <= n; i++) {
stageFailureCountMap.put(i, 0);
stageFailureMap.put(i, 0.0);
}
// 1. 실패율 구하기
for (int stage : stages) {
if (stage == n + 1) {
stageFailureCountMap.put(n, stageFailureCountMap.getOrDefault(n, 0) + 0);
continue;
}
stageFailureCountMap.put(stage, stageFailureCountMap.getOrDefault(stage, 0) + 1);
}
// 2. 실패율 계산하기
int total = stages.length;
for (int key : stageFailureCountMap.keySet()) {
if (total == 0) {
stageFailureMap.put(key, 0.0);
continue;
}
stageFailureMap.put(key, (double) stageFailureCountMap.get(key) / total);
total -= stageFailureCountMap.get(key);
}
// 3. 실패율 내림차순 정렬하기
List<Integer> answer = stageFailureMap.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
.map(Map.Entry::getKey)
.collect(Collectors.toList());
return answer;
}
}
'PS' 카테고리의 다른 글
[자바] 프로그래머스 : 여행경로 (DFS 백트래킹) / 접근 방법 및 풀이 (0) | 2022.12.21 |
---|---|
[자바] 프로그래머스 - 명예의 전당 (1) / 구현 문제 Stream 풀이 (0) | 2022.11.25 |
[자바] 프로그래머스 - 피로도 / 공포의 백트래킹 알고리즘 정복하기 (1) | 2022.11.14 |
[자바] 프로그래머스 - 주차 요금 계산 (2022 카카오 블라인드) / HashMap 풀이 (0) | 2022.11.10 |
[자바] 프로그래머스 - 게임 맵 최단거리 (BFS) / 유사문제 (0) | 2022.11.07 |