Moon_Dev_Blog :)

[프로그래머스] 실패율 본문

IT/알고리즘풀이

[프로그래머스] 실패율

돌베기 2025. 1. 19. 20:21

문제설명

슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스테이지 차이가 너무 큰 것이 문제였다.

이 문제를 어떻게 할까 고민 한 그녀는 동적으로 게임 시간을 늘려서 난이도를 조절하기로 했다. 역시 슈퍼 개발자라 대부분의 로직은 쉽게 구현했지만, 실패율을 구하는 부분에서 위기에 빠지고 말았다. 오렐리를 위해 실패율을 구하는 코드를 완성하라.

실패율은 다음과 같이 정의한다. 
- 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수

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

class Solution {
    fun solution(N: Int, stages: IntArray): IntArray {
        var answer = intArrayOf()
        var user = stages?.size 
        val stagesMap = stages?.toList()?.groupingBy { it }?.eachCount()?.toSortedMap()  
        val failMap = mutableMapOf<Int, Float>() 
        
        repeat(N) { it ->
            val stayUser = stagesMap?.get(it+1)    
            failMap.put(it+1, failureRate(stayUser ?: 0, user))
            user -= stayUser ?: 0            
        }
                
        answer = failMap.toList().sortedByDescending { it.second }.map { it.first }.toIntArray()
        
        return answer
    }
    
    fun failureRate(failUser: Int, user: Int): Float {         
        if (user == 0) return (0.0).toFloat()     
        return failUser.toFloat() / user.toFloat()
    }
}

풀이설명

// 1. user에 전체 유저 수를 담아둔다 (stages.size)
// 2. stagesMap에 스테이지별 인원을 체크하고 정렬한다. 
// 3. N(스테이지) 개수 만큼 반복을 실행하며 1번에서 정의한 Map에서 스테이지(it+1) 키 값을 통해 스테이지별 현재 체류중인 유저를 가져온다.
// 4. failureRate 메소드에 현재 스테이지의 유저와, 현재 전체유저를 전달하여 실패율을 가져와 failMap에 스테이지를 Key로 Value에 실패율을 넣어준다.
// 5. 이후 해당 스테이지의 실패한 유저를 빼기 위한 로직을 실행
// 6. repeat 반복이 진행된 이후 스테이지별 실패율이 담긴 failMap을 List 형변환 후 실패율을 기준으로 내림차순 후 스테이지값을 리스트화후 IntArray로 리턴한다.

 

Comments