[ Programmers ] 2019 KAKAO BLIND RECRUITMENT - 실패율 (Java)

ma.caron_g·2021년 12월 3일
0

Lv.1 - Programmers (완성)

목록 보기
60/74
post-thumbnail

1. Problem 📃

[ 2019 KAKAO BLIND RECRUITMENT - 실패율 ]

https://programmers.co.kr/learn/courses/30/lessons/42889



2. Constraint 🔗



3. Solution 🔑

  1. 각 라운드에 몇 명이 지나쳤는지 담을 배열 all을 선언(stages 값은 도전하고 있는 라운드이며 N+1의 값은 이미 도전을 모두 마친 사용자 이므로 N+1 만큼 선언)
  2. 도전자가 존재하는 challenger 배열 선언(stages 값은 도전하고 있는 라운드이며 N+1의 값은 이미 도전을 모두 마친 사용자 이므로 N+1 만큼 선언)
  3. 각 라운드 마다의 실패율을 담아줄 rate 배열 선언
  4. challenger에 스테이지마다 머물고 있는 도전자들의 수를 배열을 확인하며 스테이지 수에 해당하는 칸을 (++)증가 시켜준다.
  5. 1라운드는 무조건 도전자들이 거치는 단계이므로 all배열 1번째 칸(0)에 8을 넣어주고 그 이후에 2번째 칸(1)부터는 전에 있는 challenger를 빼주면서 칸을 채워준다.
    arr[i] = arr[i-1] - challenger[i-1];
  6. for문을 이용해서 [ 해당 스테이지의 도전자 수 / 도전해 본 도전자 수 ]를 하여 실패율을 구해준다. 만약 arr 배열 값이 0 (= 도전해 본 사람이 아무도 없으면)이라면 실패율은 0으로 rate와 실패율 리스트에 같이 넣어준다.
  7. 실패율 리스트를 내림차 순으로 정렬 후, 리스트의 맨 앞의 값(.get(0))와 배열을 비교하여 몇번째 인덱스에 존재하는지 판별 후 인덱스+1(배열은 0번 부터 시작하므로)의 값을 answer 배열에 담는다. 그 후 해당 인덱스는 동등한 확률값에 걸리지 않기 위해 -1로 값을 변경 후, 사용 한 rate값은 리스트에서 (.remove(0))를 통해 제거 후 break;
  8. answer값을 리턴.

4. Code 💻

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;

class Solution {
	public int[] solution(int N, int[] stages) {

		int[] all = new int[N + 1];
		int[] challenger = new int[N + 1];
		double[] rateArr = new double[N];
		
		
		Arrays.sort(stages);
		
		all[0] = stages.length;
		
		for (int i=0; i<stages.length; i++) {
			challenger[stages[i] - 1]++;
		}
		
		for (int i=1; i<N; i++) {
			all[i] = all[i-1] - challenger[i-1]; 
		}

		ArrayList<Double> rate = new ArrayList<Double>();
		for (int i=0; i<N; i++) {
			if(all[i] == 0) {
				rate.add(0.0);
				rateArr[i] = 0.0;
			}
			else {
				rate.add((double) challenger[i] / all[i]);
				rateArr[i] = rate.get(i);
			}
		}
		
		Collections.sort(rate, Collections.reverseOrder());
		//System.out.println();

		int[] answer = new int[N];
		
		for (int i = 0; i < rateArr.length; i++) {
			double max = rate.get(0);

			for(int j = 0; j<rateArr.length; j++) {
				if(max == rateArr[j]) {
					answer[i] = j+1;
					rateArr[j] = -1;
					rate.remove(0);
					break;
				}
			}
		}

		return answer;
	}
}

5. Growth 🍄

처음에 리스트 없이 for문으로만 해결했더니 시간이 100ms 이상 나오는 결과가 있었는데 리스트를 이용하니 시간이 축소 되었고, 코드도 좀 더 간결해졌다.
profile
다른 사람이 만든 것을 소비하는 활동보다, 내가 생산적인 활동을 하는 시간이 더 많도록 생활화 하자.

0개의 댓글