Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Tags more
Archives
Today
Total
관리 메뉴

공부블로그

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

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;
    }
}

'IT > 알고리즘' 카테고리의 다른 글

[프로그래머스] 3진법 뒤집기  (0) 2022.06.11
[프로그래머스] 모의고사  (0) 2022.06.11
1일 1코딩 [프로그래머스]  (0) 2022.05.24
1일 1코딩 [프로그래머스]  (0) 2022.05.20
1일 1코딩  (0) 2022.05.15
Comments