본문 바로가기
PS

[자바] 프로그래머스 - 실패율 (2019 카카오 블라인드) / HashMap 풀이

by 제이._ 2022. 11. 17.

https://school.programmers.co.kr/learn/courses/30/lessons/42889

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

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;
        }
}