본문 바로가기
코딩테스트 연습

게임의 각 스테이지별로 실패율을 구하는 로직

by 고유빙글 2021. 8. 23.
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;

public class failRate {

	public static void main(String[] args) {
		
		int[] stages = {4,4,4,4,4};
		int N = 5;
		int[] answer = solution(N, stages);
		
		System.out.print("{");
		for (int i = 0; i < answer.length; i++) {
			System.out.print(answer[i]);
			if(i!=answer.length-1) {
				System.out.print(",");
			}
		}
		System.out.println("}");
		
	}

	private static int[] solution(int n, int[] stages) {
		int[] answer = new int[n];
		double[] rate = new double[n];
		double[] fail = new double[n];
		
		for (int i = 0; i < fail.length; i++) {
			for (int j = 0; j < stages.length; j++) {
				if(stages[j]==i+1) {
					fail[i]++;
				}	
			}
		}
		
		int sum = 0;
		for (int i = 0; i < fail.length; i++) {
			
			if(i==0) rate[i]=fail[i]/(stages.length);
			else {
				sum += fail[i-1];
				if(stages.length-sum!=0) rate[i]=fail[i]/(stages.length-sum);
				else rate[i]=0.0;
			}
		}
		
		System.out.println("도전자 : "+stages.length);
		
		System.out.print("{");
		for (int i = 0; i < rate.length; i++) {
			System.out.print(rate[i]);
			if(i!=rate.length-1) {
				System.out.print(",");
			}
		}
		System.out.println("}");
		
		LinkedHashMap<Integer, Double> map = new LinkedHashMap<Integer, Double>();
		for (int i = 0; i < rate.length; i++) {
			map.put((i+1),rate[i]);
		}
//		System.out.println(map);
		List<Integer> list = new ArrayList<>(map.keySet());
		Collections.sort(list, (value1, value2) -> (map.get(value2).compareTo(map.get(value1))));
		
		int count = 0;
		for(Integer i : list) {
//			System.out.println(i);
			answer[count]=i;
			count++;
		}
		
		return answer;
	}

}

분모가 0 이 되는 경우를 유의해야겠다.

또한 내림차순, 오름차순을 좀 더 다양하게 활용하는 법을 공부해야겠다.