-
[프로그래머스 Level1][Java] 실패율Coding Test/Programmers 2021. 12. 8. 20:04
실패율
- 게임 스테이지마다 실패율을 구하고 그 실패율이 가장 높은 스테이지부터 내림차순으로 정렬하여 리턴하는 문제
※ 생각하기
- 문제를 먼저 이해하자
- 실패율을 구하는 방법
※ 풀이법
1) 스테이지를 key로 실패율을 value로 하는 HashMap 객체 생성(hs)
2) 1 ~ 스테이지 개수(N)만큼 돌리는 for문에서 스테이지 비교를 위한 변수(stage)를 생성하고 i 값으로 초기화한다.
그리고 스테이지에 도달했으나 클리어하지 못한 플레이어의 수와 스테이지에 도달한 플레이어 수를 담을 변수를 생성
(noClearPlayer, stageReachedPlayer)
3) 사용자가 멈춰있는 스테이지 번호만큼 이중 for문을 돌리며stages[i]와 stage(스테이지)가 같을 경우 스테이지에 도달했으나
클리어하지 못한 플레이어(noClearPlayer) 1 증가
stages[i]가 stage(스테이지) 보다 크거나 같을 경우 스테이지에 도달한 플레이어(stageReachedPlayer) 1 증가
4) 실패율을 저장할 double 타입의 변수 생성(fail)
- 스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은 0이므로 스테이지에 도달했으나 클리어하지 못한
플레이어와 스테이지에 도달한 플레이어가 0이 아닐 때 조건을 주어 실패율을 구해야한다.
- 실패율 = 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수
5) 스테이지와 실패율을 key와 value로 하여 HashMap에 담기
6) answer의 길이만큼 for문을 돌리며 비교하여 가장 큰 value를 가진 key를 answer[i]에 담아주고 HashMap에서 제거 반복
이해하기가 매우 어려웠던 문제어떤 식으로 풀어야 할지 감이 안와서 역시나 구글링의 힘을 빌려 학습했다... 노력하자!


import java.util.HashMap; import java.util.Map; /** * 2021-12-07 * 프로그래머스 level1 : 실패율 */ public class Solution { // 결과 확인을 위함 public static void main(String[] args) { Solution st = new Solution(); int N = 5; int[] stages = {2, 1, 2, 6, 2, 4, 3, 3}; System.out.println(st.solution(N, stages)); } public int[] solution(int N, int[] stages) { int[] answer = new int[N]; // key : 스테이지 , value : 실패율을 담을 HashMap 객체 Map<Integer, Double> hs = new HashMap<Integer, Double>(); for(int i=1; i<=N; i++) { int stage = i; // 스테이지 int noClearPlayer = 0; // 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 int stageReachedPlayer = 0; // 스테이지에 도달한 플레이어 수 for(int j=0; j<stages.length; j++) { if(stages[j] == stage) noClearPlayer++; if(stages[j] >= stage) stageReachedPlayer++; } // 실패율 : 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수 // 스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은 0 double fail = 0; if(noClearPlayer != 0 && stageReachedPlayer != 0) { fail = (double) noClearPlayer / stageReachedPlayer; } // HashMap에 담기(key : 스테이지, value : 실패율) hs.put(stage, fail); } System.out.println(hs); // key를 내림차순으로 answer에 담기 for(int i=0; i<answer.length; i++) { // 실패율이 0인 것이 있기 때문에 -1 double temp = -1; // 가장 큰 value를 가진 key int maxKey = 0; // 비교하여 자신보다 큰 key값 리턴하기 for(Integer key : hs.keySet()) { if(temp < hs.get(key)) { temp = hs.get(key); maxKey = key; } } // answer에 key값 저장 answer[i] = maxKey; // maxKey값 제거 hs.remove(maxKey); } return answer; } }'Coding Test > Programmers' 카테고리의 다른 글
[프로그래머스 Level1][Java] 다트 게임 (0) 2021.12.08 [프로그래머스 Level1][Java] 크레인 인형뽑기 게임 (0) 2021.12.08 [프로그래머스 Level1][Java] 신규 아이디 추천 (0) 2021.12.08 [프로그래머스 Level1][Java] 비밀지도 (0) 2021.12.08 [프로그래머스 Level1][Java] 키패드 누르기 (0) 2021.12.08