Welcome! Everything is fine.

[프로그래머스/Lv.1] 실패율(2019 KAKAO BLIND RECRUITMENT) - Java 본문

프로그래머스/Lv.1

[프로그래머스/Lv.1] 실패율(2019 KAKAO BLIND RECRUITMENT) - Java

개발곰발 2024. 4. 25.
728x90

📌 문제

 

프로그래머스

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

programmers.co.kr

📌 풀이

이번 문제는 게임에서 실패율이 높은 스테이지부터 내림차순 정렬해 반환하는 문제이다. 실패율은 도전한 사용자의 수 / 아직 클리어하지 못한 사용자의 수이다. 각각의 실패율만 구하고 실패율 순으로 정렬을 하지 못해 틀렸던 문제...

 

전체적인 코드의 흐름은 다음과 같다.

  • 각 스테이지별 도전한 사용자 수와 해당 스테이지를 클리어하지 못한 사용자의 수를 구한다.
  • HashMap에 스테이지와 실패율을 계산해 저장한다.
  • 실패율을 기준으로 내림차순 정렬한다.

먼저 다음과 같이 각 스테이지별 도전한 사용자 수를 success 배열에, 해당 스테이지를 클리어하지 못한 사용자 수를 fail 배열에 넣는다.  배열의 0번째 인덱스는 1번째 스테이지, 1번째 인덱스는 2번째 스테이지...순으로 저장된다고 보면 된다. 따라서 success 배열에서는 0부터 stages 배열의 원소만큼 돌면서 해당 스테이지에 도전한 사용자 수를 증가 시킨다. fail 배열에서는 [stages 배열의 원소 - 1] 인덱스의 숫자를 증가시켜 해당 스테이지에서 아직 클리어하지 못한 사용자를 나타낸다.

int[] failUser = new int[N + 1];
int[] successUser = new int[N + 1];

for (int i = 0; i < stages.length; i++) {
    for (int j = 0; j < stages[i]; j++) {
        successUser[j]++;
    }
    failUser[stages[i] - 1]++;
}

 

그 후에는 HashMap을 선언한 뒤 N만큼(스테이지 수만큼) 돌면서 fail 배열 혹은 success 배열이 0이라면 해당 스테이지를 key로, 0.0을 value로 저장한다. 그게 아니라면 fila[i] / sucess[i] 로 실패율을 구해 저장한다. 여기서 나눈 값을 double로 바꿔줘야 한다.

for (int i = 0; i < N; i++) {
    if (fail[i] == 0 || success[i] == 0) {
        map.put(i + 1, 0.0);
    } else {
        map.put(i + 1, (double) fail[i] / success[i]);
    }
}

 

그리고나서 정렬을 위해 list를 만들고, 다음과 같이 map의 value를 기준으로 key를 정렬한다. 내림차순 정렬이니 o2, o1 순으로 람다식을 작성한다. 여기서 정렬하는 방법을 잘 몰라서 고생했다. 정렬 후에는 list를 스트림을 통해 int 배열로 바꿔 반환한다. 정렬에 관한 내용은 이전 Comparator 포스팅을 참고하자.

List<Integer> list = new ArrayList<>(map.keySet());
list.sort((o1, o2) -> Double.compare(map.get(o2), map.get(o1)));
        
return list.stream().mapToInt(i -> i).toArray();

📌 전체 코드

import java.util.*;

class Solution {
    public int[] solution(int N, int[] stages) {
        int[] answer = {};
        int[] fail = new int[N + 1];
        int[] success = new int[N + 1];
        
        for (int i = 0; i < stages.length; i++) {
            for (int j = 0;j < stages[i]; j++) {
                success[j]++;
            }
            fail[stages[i] - 1]++;
        }
        
        Map<Integer, Double> map = new HashMap<>();
        
        for (int i = 0; i < N; i++) {
            if (fail[i] == 0 || success[i] == 0) {
                map.put(i + 1, 0.0);
            } else {
                map.put(i + 1, (double) fail[i] / success[i]);
            }
        }
        
        List<Integer> list = new ArrayList<>(map.keySet());
        list.sort((o1, o2) -> Double.compare(map.get(o2), map.get(o1)));
        
        return list.stream().mapToInt(i -> i).toArray();
    }
}