개발자가 된 감자

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

Coding Test/프로그래머스

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

감자씨 2024. 11. 13. 17:49
728x90

programmers_logo

전체 스테이지의 개수 N, 게임을 이용하는 사용자가 현재 멈춰있는 스테이지의 번호가 담긴 배열 stages가 매개변수로 주어질 때, 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 return 하기

실패율 : 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수

 

 

1. 각 변수 초기화

int[] answer = new int[N];	// 실패율 높은 순서대로 스테이지의 데이터를 담을 배열
int player = stages.length;	// 사용자가 멈춰있는 스테이지의 번호가 담긴 player 배열 크기로 전체 사용자 수 구하기
Double[] array = new Double[N]; // 스테이지 순서대로 실패율을 담을 배열
Map<Integer, Double> map = new HashMap<>();

 

2. states 배열 오름차순으로 정렬

Arrays.sort(stages);

 

3. 실패율 구하기

for(int i=1; i<(N+1); i++){ // 스테이지 번호는 1부터~

    int cUser = 0;	// 해당 스테이지에서 멈춘 사용자 수 초기화
    
    for(int j=0; j<stages.length; j++){	// 오름차순으로 정렬된 stages에서 스테이지 번호 꺼내오기
        // 해당 스테이지 번호(i)와 사용자가 클리어하지 못한 스테이지 번호(states[j])가 같을 경우 cUser 값 증가
        if(i == stages[j]) ++cUser;
    }
    
    double result = 0; // 실패율을 구하기 위한 double 타입의 변수 초기화
    if(cUser != 0) result = cUser/(double)player; // 클리어하지 못한 사용자가 0명이 아니라면, 실패율 계산하여 구하기
    array[i-1] = result; // array 배열에 순서대로 실패율 값 담기
    map.put(i, result); // Map에도 key:index, value:실패율 형태로 담기
    
    // 전체 사용자에서 cUser 값 빼기 (해당 스테이지에서 멈춘 사용자는 다음 스테이지에 도달하지 못한 사용자이므로)
    player -= cUser;
}

 

4. 각 스테이지별 실패율을 순서대로 담았던 array 배열을 내림차순으로 정렬

Arrays.sort(array, Collections.reverseOrder());

 

5. 실패율이 높은 순서대로 정렬된 array 배열에서 각 스테이지 번호를 찾기 위한 코드

/* 
* 높은 순서대로 정렬한 array는 정렬했기 때문에 스테이지 번호를 알 수가 없음
* key:스테이지 번호, value:실패율 형태로 저장했던 map에서 실패율이 같은 스테이지로 번호 찾기
*/
for(int i=0; i<array.length; i++){ // array에서 실패율 꺼내오기

   for(int j=1; j<N+1; j++){ // Map에서 스테이지 번호(key) 값으로 실패율 조회 하기              
       if(map.get(j) != null){ 
           int result = Double.compare(map.get(j), array[i]); // 실패율 비교
           if(result == 0){ // 비교 결과 두 값이 같을 경우(0) 스테이지 번호를 anwser에 담고 break.                
                answer[i] = j;
                map.remove(j);
                break;
           }
       }
   }
   
}

return answer;

 

 

전체 코드

import java.util.*;

class Solution {
    public int[] solution(int N, int[] stages) {
        int[] answer = new int[N];
        int player = stages.length;
        Double[] array = new Double[N];
        Map<Integer, Double> map = new HashMap<>();
        
        Arrays.sort(stages);      
        for(int i=1; i<(N+1); i++){
            int cUser = 0;
            for(int j=0; j<stages.length; j++){
                if(i == stages[j]) ++cUser;
            }
            double result = 0;
            if(cUser != 0) result = cUser/(double)player;
            array[i-1] = result;
            map.put(i, result);
            player -= cUser;
        }
        
        Arrays.sort(array, Collections.reverseOrder()); 
        for(int i=0; i<array.length; i++){
           for(int j=1; j<N+1; j++){               
               if(map.get(j) != null){
                   int result = Double.compare(map.get(j), array[i]);
                   if(result == 0){                   
                        answer[i] = j;
                        map.remove(j);
                        break;
                   }
               }
           }
        }
        
        return answer;
    }
}
728x90
Comments