-
프로그래머스 - 실패율 [자바]Algorithms/- 프로그래머스 2022. 1. 31. 01:41
- 문제 링크 : 실패율
코딩테스트 연습 - 실패율
실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스
programmers.co.kr
정답
import java.util.*; class Solution { public int[] solution(int N, int[] stages) { /* 실패율 = 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수 전체 스테이지 수 N 멈춰 있는 stages 총 플레이어수 stages.length 모두 클리어한 유저가 있어서 N+1이 됨 실패율 높은 스테이지부터 내림차순 return */ int length = stages.length; //플레이어 수 //멈춰 있는 스테이지 array int[] stageArr = new int[N+1]; //모두 클리어한 유저는 N+1스테이지에 있음 int[] answer = new int[N]; //모든 플레이어 돌면서 어디 있는지 체크하고 arr에 담는다. for(int i=0; i<length; i++){ int stageNum = stages[i]; stageArr[stageNum - 1]++; } //실패율은 N 스테이지까지만 계산하면 됨 Double[] failArr = new Double[N]; double failRate = 0d; Map<Integer, Double> failMap = new HashMap<>(); //실패율 계산 for(int i=0; i<N ; i++){ //현재 클리어 못한 수 //하위는 모두 클리어 한거지 if(stageArr[i] == 0){ failArr[i] = 0d; failMap.put(i+1, 0d); continue; } failRate = (double) stageArr[i] / (double)length; length -= stageArr[i]; failArr[i] = failRate; failMap.put(i+1, failRate); } //역 정렬 Arrays.sort(failArr, Collections.reverseOrder()); //정렬된 arr와 map에서 index를 찾는다. for(int i=0; i<failArr.length; i++){ for(int index : failMap.keySet()){ Double mapRate = failMap.get(index); if(mapRate.equals(failArr[i])){ answer[i] = index; failMap.remove(index); break; } } } return answer; } }
분석
- 해당 stage에 도달한 플레이어가 없어서 0이 되면 0을 나누기 때문에 에러가 발생
- stage가 도달한 플레이어가 0인 경우 실패율 0으로 예외처리
참고할 만한 정답
- 클래스로 index와 실패율을 정리한 정답
import java.util.ArrayList; import java.util.Collections; import java.util.List; class Solution { public int[] solution(int N, int[] lastStages) { int nPlayers = lastStages.length; int[] nStagePlayers = new int[N + 2]; for (int stage : lastStages) { nStagePlayers[stage] += 1; } int remainingPlayers = nPlayers; List<Stage> stages = new ArrayList<>(); for (int id = 1 ; id <= N; id++) { double failure = (double) nStagePlayers[id] / remainingPlayers; remainingPlayers -= nStagePlayers[id]; Stage s = new Stage(id, failure); stages.add(s); } Collections.sort(stages, Collections.reverseOrder()); int[] answer = new int[N]; for (int i = 0; i < N; i++) { answer[i] = stages.get(i).id; } return answer; } class Stage implements Comparable<Stage> { public int id; public double failure; public Stage(int id_, double failure_) { id = id_; failure = failure_; } @Override public int compareTo(Stage o) { if (failure < o.failure ) { return -1; } if (failure > o.failure ) { return 1; } return 0; } } }
- 자바 기본 기능으로 풀이한 정답
class Solution { public int[] solution(int N, int[] stages) { int[] answer = new int[N]; double[] tempArr = new double[N]; int arrLength = stages.length; int idx = arrLength; double tempD = 0; int tempI = 0; for (int i = 0; i < arrLength; i++) { int stage = stages[i]; if (stage != N + 1) answer[stage - 1] += 1; } for (int i = 0; i < N; i++) { int personNum = answer[i]; tempArr[i] = (double) personNum / idx; idx -= personNum; answer[i] = i + 1; } for (int i = 0; i < N; i++) { for (int j = 1; j < N - i; j++) { if (tempArr[j - 1] < tempArr[j]) { tempD = tempArr[j - 1]; tempArr[j - 1] = tempArr[j]; tempArr[j] = tempD; tempI = answer[j - 1]; answer[j - 1] = answer[j]; answer[j] = tempI; } } } return answer; } }
- 나와 비슷하게 map으로 풀었지만 방식은 다른 정답
import java.util.*; class Solution { public int[] solution(int N, int[] stages) { Map<Integer,Integer> map = new HashMap<>(); Map<Integer,Double> ans = new HashMap<>(); for (int stage : stages) { int count = map.containsKey(stage) ? map.get(stage) + 1 : 1; map.put(stage,count); } int total = stages.length; for (int i = 1; i <= N; i++) { if (map.containsKey(i)) { int cnt = map.get(i); ans.put(i, (double) cnt / total); total -= cnt; } else { ans.put(i, 0.0); } } List<Integer> list = sortByValue(ans); int[] answer = new int[list.size()]; for (int i = 0; i < list.size(); i++) { answer[i] = list.get(i); } return answer; } public static List<Integer> sortByValue(final Map<Integer,Double> map) { List<Integer> list = new ArrayList(); list.addAll(map.keySet()); Collections.sort(list, (Comparator) (o1, o2) -> { Object v1 = map.get(o1); Object v2 = map.get(o2); return ((Comparable) v2).compareTo(v1); }); return list; } }
반응형