문제
https://programmers.co.kr/learn/courses/30/lessons/42889
코딩테스트 연습 - 실패율
실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스
programmers.co.kr
풀이
카카오 문제답게 다른 레벨1 문제들에 비해 구현하기 조금 번거로웠다. 문제를 해결하기 위한 알고리즘은 따로 필요 없었고, 순수 구현으로 풀 수 있었다.
fail와 success 배열을 만들어주어 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수를 각각 관리해주었다. 자신이 밟고 있는 현재 스테이지가 stages[i]라면 1 ~ stages[i]까지의 스테이지는 모두 클리어한 것이므로 1 ~ stage[i]의 success를 하나씩 증가시켜주었고, 현재 밟고 있는 스테이지가 stages[i]라면 도달했으나 아직 클리어하지 못한 것이므로 1증가 시켜주어 각각의 요소들을 구할 수 있었다.
이후에는 fail을 success로 나누어주어 스테이지별 실패율을 각각 구해주고 map에 넣어주었다. map을 사용한 이유는 우리가 최종적으로 return해야 하는 것은 실패율이 아닌 각 스테이지의 넘버이기 때문에 map을 통해 스테이지 넘버 : 실패율의 모양으로 관리해주었고 map을 내림차순 정렬시켜 각각의 key값만(스테이지 넘버) answer에 넘겨주면 정답을 도출할 수 있다.
코드
import java.util.*;
class Solution {
public int[] solution(int N, int[] stages) {
int[] success = new int[N + 2];
int[] fail = new int[N + 2];
HashMap<Integer, Float> map = new HashMap<Integer, Float>();
for(int i = 0; i < stages.length; i++) {
for(int j = 1; j <= stages[i]; j++) {
success[j]++;
}
fail[stages[i]]++;
}
for(int i = 1; i <= N; i++) {
float temp = 0;
if(success[i] == 0) {
temp = 0;
} else {
temp = (float) fail[i] / (float) success[i];
}
map.put(i, temp);
}
List<Integer> listKeySet = new ArrayList<>(map.keySet());
Collections.sort(listKeySet, (value1, value2) -> (map.get(value2).compareTo(map.get(value1))));
int[] answer = new int[map.size()];
int idx = 0;
for(Integer key : listKeySet) {
answer[idx] = key;
idx++;
}
return answer;
}
}
'프로그래머스' 카테고리의 다른 글
[프로그래머스] 프로그래머스 Level2 최솟값 만들기 Java (0) | 2022.05.18 |
---|---|
[프로그래머스] 프로그래머스 Level1 [1차] 비밀지도 Java (카카오 코딩테스트) (0) | 2022.05.12 |
[프로그래머스] 프로그래머스 Level1 모의고사 Java (0) | 2022.05.06 |
[프로그래머스] 프로그래머스 Level3 정수 삼각형 Java (0) | 2022.05.06 |
[프로그래머스] 프로그래머스 Level2 점프와 순간 이동 Java (0) | 2022.05.05 |