IT/알고리즘
[프로그래머스] 실패율
So1_b
2022. 6. 2. 17:58
https://programmers.co.kr/learn/courses/30/lessons/42889
코딩테스트 연습 - 실패율
실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스
programmers.co.kr
< 22-05-27 ~ 06-2일 >
시도한 테스트 케이스
모두 통과가 되지만 코드 실행 시 2 ~ 13, 15, 17, 22테스트 실패가 뜬다.
질문하기를 확인한 결과
- 스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은 0 으로 정의한다.
- 0/0, 0/1으로 나뉘는 경우
를 고려해야 한다고 해서 if문을 추가했지만 여전히 통과가 안된다.
import java.util.*;
import java.util.Map.Entry;
class Solution {
public int[] solution(int N, int[] stages) {
HashMap<Integer, Double> map=new HashMap<>(stages.length);
int demo; //분모
double num; //분자
for(int i=1; i<=N; i++) {
demo=0;
num=0.0;
System.out.println("i= "+i);
for(int j=0; j<stages.length; j++) {
if(stages[j]>=i) {
demo+=1.0;
if(stages[j]==i) num+=1.0;
}
}
if(demo==0) { //스테이지에 도달한 유저가 없음 == 0
map.put(i, 0.0);
}else if(num==0.0){
map.put(i, 0.0);
}else if(demo>0.0){
System.out.println(Double.isInfinite(num/demo));
double d=Double.valueOf( String.format("%.2f", num/demo));
map.put(i, d);
}
}
//정렬
List<Entry<Integer, Double>> list = new ArrayList<Entry<Integer, Double>>(map.entrySet());
Collections.sort(list, new Comparator<Entry<Integer,Double>>(){
@Override
public int compare(Entry<Integer, Double> o1, Entry<Integer, Double> o2) {
if(o1.getValue()==o2.getValue()) {return o1.getKey().compareTo(o2.getKey());}
return o2.getValue().compareTo(o1.getValue());
}
});
int ptr=0;
int[] answer=new int[list.size()];
for(Entry<Integer,Double> e: list) {
answer[ptr++]=(int)e.getKey();
}
return answer;
}
}
원인
1. 실패율 계산 시 소수점 두번째 자리까지만 나타내도록 String.format("%.2f", num/demo)를 사용했는데
그 이하의 자리수에서 달라도 똑같은 수로 나오기 때문이었음.
해당 코드를 삭제하니 성공함
성공 코드
import java.util.*;
import java.util.Map.Entry;
class Solution {
public int[] solution(int N, int[] stages) {
HashMap<Integer, Double> map=new HashMap<>(stages.length);
int demo; //분모: 스테이지에 도달한 사람 수
double num; //분자: 스테이지에 도달했지만 클리어하지 못한 사람 수
for(int i=1; i<=N; i++) {
demo=0;
num=0.0;
System.out.println("i= "+i);
for(int j=0; j<stages.length; j++) {
if(stages[j]>=i) {
demo+=1.0;
if(stages[j]==i) num+=1.0;
}
}
if(demo==0) { //스테이지에 도달한 유저가 없음 == 0
map.put(i, 0.0);
}else if(num==0.0){
map.put(i, 0.0);
}else if(demo>0.0){
System.out.println(Double.isInfinite(num/demo));
double d=Double.valueOf(num/demo);
//double d=Double.valueOf( String.format("%.2f", num/demo));
map.put(i, d);
}
}
//정렬
List<Entry<Integer, Double>> list = new ArrayList<Entry<Integer, Double>>(map.entrySet());
Collections.sort(list, new Comparator<Entry<Integer,Double>>(){
@Override
public int compare(Entry<Integer, Double> o1, Entry<Integer, Double> o2) {
if(o1.getValue()==o2.getValue()) {return o1.getKey().compareTo(o2.getKey());}
return o2.getValue().compareTo(o1.getValue());
}
});
int ptr=0;
int[] answer=new int[list.size()];
for(Entry<Integer,Double> e: list) {
answer[ptr++]=(int)e.getKey();
}
return answer;
}
}