알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


Think🤔

import java.util.Arrays;

class Solution {
    public int[] solution(int N, int[] stages) {
        int[] answer = new int[N];
        float[] failper = new float[N]; // double까지 필요없어서 float 사용
        
        int chall = stages.length;
        int level = 1;

        // 스테이지별 실패율 구하는 부분
        while(chall > 0){ 
            int fail = 0;
            for(int i=0; i<stages.length; i++){
                if(stages[i] == level){ // 못깬사람의 스테이지 하고 level 같으면 실패 더해줌
                    stages[i] = 0; // 실패한 사람 0으로
                    fail++;
                }
            }

            if(fail == 0) { // 만약 실패 0이면 하나 남거나 나머지 다 성공했으므로 break
                break;
            }

           failper[level-1] = (float)fail / (float)chall;
           chall = chall - fail; // 분모의 수는 실패한 개수를 빼야하므로 넣어줌
           level++; // 레벨은 0~ 차근차근 올라가므로 마지막에 ++ 

        }

        // 실패율이 높은 레벨부터 내림차순
        for(int i=0; i<N; i++) {
            float max = -1; // max를 0으로 수정하면 값에 0이 있을경우 그 값과 비교 불가능 
            int deleteNum = 0;
            for(int j=0; j<N; j++) {
                if(failper[j] > max) {
                    max = failper[j];
                    deleteNum = j;
                }
            }

            answer[i] = deleteNum + 1;
            failper[deleteNum] = -1; // 이미 최고 실패율이면 -1로 바꿔주고 max값에 못들어가게
        }
        
        return answer;
    }
}

2번째 조건, 

모든 사용자가 마지막 스테이지에 있으므로 4번 스테이지의 실패율은 1이며 나머지 스테이지의 실패율은 0이다.

  • [4,1,2,3]

생각 안했을떄의 결과 63점 .. 중간에 코드를 수정한다고 해도 런타임 에러가 발생했으므로 코드 수정 필요

 

while문으로 length를 줄이는 부분에서 if(fail == 0) 부분도 가독성이 좋지 않고, 로직상 문제가 있어 런타임에러가 나기 때문에 리팩토링 필요


Solution✍
package kcue.test;
import java.util.Arrays;

public class failRate {

	public static void main(String[] args) {
        // 5 [2,1,2,6,2,4,3,3] [3,4,2,1,5]
        // 4 [4,4,4,4,4]       [4,1,2,3]
        // 3 [1,1,1]		   [0,0,0]
        // 5 [3,3,3,3]		   [3,1,2,4,5]         
        int N = 3;
        int[] stages = {1,1,1};
        /////////////////////////////////////////////////////////
	        int[] answer = new int[N];
	        
	        int chall = stages.length;
	        int level = 1;
	        
	        float[] failper = new float[N];
	        
	        for(int j=0; j<N; j++) {
	           int fail = 0;
	           for(int i=0; i<stages.length; i++){
	               if(stages[i] == level){
	                   stages[i] = 0; // 실패한 사람 0으로
	                   fail++;
	               }
	           }
	           if(chall == 0) {
	        	   break;
	           }
	           failper[level-1] = (float)fail / (float)chall;
	           
	           chall = chall - fail;
	           level++;
	           System.out.println("chall : " + chall + " , fail : " + fail + " , failper[] " + Arrays.toString(failper));
	        }
	        
	        // 실패율이 높은 레벨부터 내림차순
	        for(int i=0; i<N; i++) {
	        	float max = -1;
	        	int deleteNum = 0;
	        	for(int j=0; j<N; j++) {
	        		if(failper[j] > max) {
	        			max = failper[j];
	        			deleteNum = j;
	        		}
	        	}
	        	
	        	answer[i] = deleteNum + 1;
	        	failper[deleteNum] = -1;
	        	System.out.println(Arrays.toString(failper));
	        	}
	        }

}

반복문으로 바꾼후, chall의 length가 0이 되면 반복문을 멈추게 해준다.

안그러면 0으로 나눠서 NaN값을 배열에 담게 되므로 오류가 발생할 수 있음..


Review🤩

// 5 [3,3,3,3]    [3,1,2,4,5]  일때도 생각을해서 , 문제를 푸는것이 중요!


 

+ Recent posts