본문 바로가기
알고리즘/문제풀이

2019 카카오 블라인드 코딩테스트 (프로그래머스, Java, 실패율)

by 모스키토끼 2019. 12. 1.

1. 실패율

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

 

코딩테스트 연습 - 실패율 | 프로그래머스

실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스테이지 차이가 너무 큰 것이 문제였다. 이 문제를 어떻게 할까 고민 한 그녀는 동적으로 게임 시간을 늘려서 난이도를 조절하기로 했다. 역시 슈퍼 개발자라 대부분의 로직은 쉽게 구현했지만, 실패율을 구하는 부분에서 위기에 빠지고 말았다. 오렐리를 위해 실패율을 구하는 코드를

programmers.co.kr

알고리즘 설명:

실패율을 구하고 Comparator로 정렬을 해주면 풀리는 문제

  • 이전 스테이지를 제외한 전체 인원수로 스테이지 인원수를 나누면 실패율을 구한다.
  • 실패율들을 Failure이라는 스테이 지명과 실패율 값이 들어간 객체를 만들어 list에 넣어준다.
  • list를 Comparator를 사용하여 실패율을 기준으로 정렬을 한다.
  • answer 배열에 순서대로 넣고 리턴해주면 끝
package test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class FailureRate {
    public int[] solution(int N, int[] stages) {
        int[] answer = {};
        int nop = stages.length;
        int[] count = new int[N+2];
        for(int stage:stages) {
        	count[stage]++;
        }
        List<Failure> list = new ArrayList<>();
        for(int i=1;i<count.length-1;i++) {
        	if(nop==0) {
        		list.add(new Failure(i,0));
        		continue;
        	}
        	list.add(new Failure(i, (double)count[i]/nop));
        	nop -= count[i];
        }
        Collections.sort(list,new Comparator<Failure>() {

			@Override
			public int compare(Failure o1, Failure o2) {
				if(o1.failure==o2.failure)return o1.stage - o1.stage;
				return o1.failure - o2.failure>0? -1:1;
			}
		});
        answer = new int[list.size()];
        for(int i=0;i<answer.length;i++) {
        	answer[i]=list.get(i).stage;
        }
        return answer;
    }
    public class Failure{
    	int stage;
    	double failure;
    	
    	public Failure(int stage,double failure) {
    		this.stage =stage;
    		this.failure = failure;
    	}
    }
    
    

	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}

댓글