코테/프로그래머스
프로그래머스 실패율
65살까지 코딩
2022. 1. 17. 00:05
728x90
반응형
import java.util.ArrayList;
import java.util.Collections;
class Solution {
public int[] solution(int N, int[] stages) {
//전체 스테이지가 N개
//현재 멈춰있는 스테이지 번호가 담긴 배열 stages
//확률이 똑같은 경우 처리와 쓸데없는 곳에서의 실수 때문에 1시간 넘게 걸려서 푼문제이다;;
int[] stop_people = new int[N+2]; // 1 2 3 4 5 6
//스테이지를 전부 클리어한 사람이 있을 수 있고
//0번째 스테이지는 없기 때문에를 처리해주기 위해 N+2 배열을 만듦
//각 스테이지 마다 멈춰 있는 사람 수 더해주기
for(int i =0; i<stages.length; i++){
for(int j=1; j<stop_people.length; j++){
if(stages[i] == j){
stop_people[j] +=1;
}
}
}
// 실패 확률을 담을 리스트
ArrayList<Double> fail = new ArrayList<>();
// 확률이 중복일 때를 위해 배열 하나를 더 만들어줌
// 스테이지를 전부 클리어한 사람이 있을 수 있기 때문에 N+1 배열을 만듦
// 이 조건 놓치기 좋음 스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은 0 으로 정의한다.
double[] doubles = new double[N+1];
double tmp = 0;
// 사람들의 수를 all로 넣어둠
double all = stages.length;
// 0번째 스테이지(실제로 존재X)가 포함된 배열이기 때문에 stop_people -1로 만듦
for(int i =1; i<stop_people.length-1; i++){
//확률 계산하고
tmp = stop_people[i] / all;
//넣어 주기전에 double형이기 때문에 NAN이나 limit이 나올 수 있어
//멈춘 스테이지에 사람이 없으면 확률은 0
if(stop_people[i] == 0){
doubles[i] =0;
}else {
//그렇지 않다면 확률은 존재!
doubles[i] = tmp;
}
// 각 스테이지에서 실패한 사람수를 전체에서 빼줌 -> 다음 스테이지 도전자 수를 알 수 있음
all -= stop_people[i];
//fail에 확률값 추가
fail.add(doubles[i]);
}
int[] answer = new int[N];
System.out.println(fail);
//확률을 내림차순으로 정렬
Collections.sort(fail);
Collections.reverse(fail);
//이부분이 은근히 까다로운 느낌이었음
//카카오LV1 풀면서 느끼는게 문제 자체는 풀만한데 제출 형식에 맞추는게 어려움
//확률이 같은경우 스테이지가 작은 수가 앞으로 가면됨
for(int i=0; i<fail.size(); i++){
//중복을 처리하기위해 저장해둔 배열사용!
for(int j=1; j<doubles.length; j++){
//따라서 1부터 시작 만약 스테이지가 높은 것 부터 원했다면 뒤에서부터 했으면 돌렸어야 됐다.
if(fail.get(i) == doubles[j]){
answer[i] = j;
doubles[j] = -1;
break;
}
}
}
for (int i : answer) {
System.out.println(i);
}
return answer;
}
}
문제:https://programmers.co.kr/learn/courses/30/lessons/42889
코딩테스트 연습 - 실패율
실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스
programmers.co.kr
728x90
반응형