💡Problem Solving/Programmers

[프로그래머스] 실패율 (Java, Python)

gom20 2021. 11. 18. 23:17

문제

https://programmers.co.kr/learn/courses/30/lessons/42889#

 

코딩테스트 연습 - 실패율

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

programmers.co.kr

풀이 

단순 구현 문제이다. 

변수가 헷갈려서 머리가 핑 도는 모먼트가 몇 번 있었다. 

Stage 클래스를 만들어서 문제를 풀었다.

소스코드

import java.util.*;

class Stage implements Comparable<Stage>{
    int no;
    double passCnt;
    double failCnt;
    double rate;
    
    public Stage(int no){
        this.no = no;
    }
    
    public void calc(int N){
        if(passCnt == 0 && failCnt ==0) rate = 0; 
        else if(passCnt == 0) rate = 1;
        else if(failCnt == 0) rate = 0;
        else this.rate = this.failCnt/(this.passCnt + this.failCnt);
    }
    
    @Override
    public int compareTo(Stage s){
        if(this.rate - s.rate > 0) return -1;
        else if(this.rate - s.rate < 0) return 1;
        else return this.no - s. no;
    }
}

class Solution {
    
    public int[] solution(int N, int[] stages) {
        ArrayList<Stage> list = new ArrayList<Stage>();
        for(int i = 1; i <= N; i++){
            list.add(new Stage(i));
        }
        
        // 통과한 사람수 / 머물러 있는 사람수 
        for(int cur : stages){
            for(int j = 1; j < cur; j++){
                list.get(j-1).passCnt++;
            }
            if(cur == N+1) continue;
            list.get(cur-1).failCnt++;
        }
        
        for(Stage s : list){
            s.calc(stages.length);
        }
        
        Collections.sort(list);       
        return list.stream().mapToInt(x -> x.no).toArray();
    }
}

 

Python

도달 했지만 통과 못한 사람 수를 stage별로 저장 

1번 스테이지부터 

도달 했지만 통과 못한 사람 수 / 도달한 사람 수 

실패율 계산 

 

다음 스테이지에서 도달한 사람 수는 이전 스테이지에서 

도달한 사람 수에 도달했지만 통과 못한 사람 수를 뺀 값을 사용한다. 

 

예를 들어 2번 스테이지라면,

2번 스테이지에 도달했지만 통과 못한 사람 수 / (1번 스테이지에 도달한 사람 수 - 1번 스테이지에서 통과 못한 사람 수)

 

이렇게 쭉 계산해서 각 스테이지별 실패율을 저장 

실패율 내림차순, 스테이지 오름차순으로 정렬 후 

스테이지 출력

 

def solution(N, stages):
    answer = []
    arrive_but_not_clear = [0]*(N+2)
    arrive = [0]*(N+2)

    stages.sort()
    for cur_stage in stages:
        arrive_but_not_clear[cur_stage] += 1
    
    arrive = len(stages)
    rate = []
    for i in range(1, N+1):
        if arrive == 0:
            rate.append((0, i))
            continue
        rate.append((arrive_but_not_clear[i]/arrive, i))
        arrive -= arrive_but_not_clear[i]
        
    rate.sort(key = lambda x:(-x[0], x[1]))
    for i in range(N):
        answer.append(rate[i][1])
        
    return answer