ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스 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;
        }
    }
Designed by Tistory.