본문 바로가기
Kotlin(프로그래머스)/Level 1

[프로그래머스/Kotlin] 실패율

by Yuno. 2022. 3. 17.
728x90

문제 링크 -> https://programmers.co.kr/learn/courses/30/lessons/42889

 

코딩테스트 연습 - 실패율

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

programmers.co.kr

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

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

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

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

제한사항

  • 스테이지의 개수 N은 1 이상 500 이하의 자연수이다.
  • stages의 길이는 1 이상 200,000 이하이다.
  • stages에는 1 이상 N + 1 이하의 자연수가 담겨있다.
    • 각 자연수는 사용자가 현재 도전 중인 스테이지의 번호를 나타낸다.
    • 단, N + 1 은 마지막 스테이지(N 번째 스테이지) 까지 클리어 한 사용자를 나타낸다.
  • 만약 실패율이 같은 스테이지가 있다면 작은 번호의 스테이지가 먼저 오도록 하면 된다.
  • 스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은 0 으로 정의한다.

------------------------------------------------------------풀이------------------------------------------------------------------
1. 스테이지별 실패율을 구해서 새로운 ArrayList(notClearPercent)에 넣는다. <- index+1은 스테이지가 된다. 
2. 실패율 배열을 중복제거, 내림차순 정렬한 새로운 List(percent)를 만들어준다. 
3. percent를 한번씩 돌면서 notClearPercent의 실패율과 같으면 notClearPercent의 index+1한 값을 새로운 리스트 set에 add한다. 
4. set을 오름차순 정렬해서 answer에 더한다. 

class Solution {
    fun solution(N: Int, stages: IntArray): IntArray {
        var answer = ArrayList<Int>()
        var notClearPercent = ArrayList<Float>()
        var set = ArrayList<Int>()

        //실패율 구하기
        for( i in 1..N){
            var clear = stages.filter{ it >= i } //스테이지 도달 플레이어 리스트
            var notClear = stages.filter{ it == i }//스테이지 도달헀으니 클리어 못한 플레이어 리스트
            if(clear.size == 0) notClearPercent.add(0f)
            else notClearPercent.add(notClear.size.toFloat()/clear.size.toFloat())
        }

        //새로운 리스트에 실패율 중복값 제거 삽입 및 내림차순 정렬
        var percent = notClearPercent.distinct().sortedDescending()

        //실패율별 스테이지 내림차순 정리
        for( i in 0..percent.size-1){
            for( j in 0..notClearPercent.size-1){
                if( percent[i] == notClearPercent[j]){
                    set.add(j+1)
                }
            }
            answer.addAll(set.sorted())
            set.clear()
        }
        return answer.toIntArray()
    }
}

------------------------------------------------------------결과------------------------------------------------------------------

실패율별 스테이지 내림차순 정리 부분에서 쓸때 없는 시간이 많이 들어가는 것 같네요.. filter랑 map어떻게 잘 쓰면 될거같은데 잘 모르겠네요 ㅜㅜ 
ArrayList대신에 map이나 해쉬 쓰면 되려나.. 한번 고민해 봐야겠네요 

 

 

 

 

- 문제에 대한 질문 댓글 환영!
- 중간에 잘못된 부분이 있다면 댓글로 남겨주세요. 수정하겠습니다.

728x90

댓글