본문 바로가기

자료구조 & 알고리즘

[프로그래머스] 실패율 (2019 KAKAO BLIND RECRUITMENT)

1단곈데도 엄청 오래 걸렸다...

dp로 풀어야하는 문제 같은데 dp가 잘 기억이 안나서 일단은 이렇게 풀었다...(금방 해결 할 수 있을거라고 생각했다.)

아래 코드 같은식으로 접근을 하니 처리해야한 예외가 너무 많았다. 그래서 for문 안에 if문만 4개 있고 끝나고도 예외 처리가 있다. 이런식으로 문제를 풀면 놓치는 예외가 생기고 실전에서는 당황하고 시간에 쫓겨 그 예외를 찾기 힘들것이다. 너무 피곤해서 코드가 복잡하고 어거지다...쓰레기 코드ㅠㅠ

 

시간 날때 dp 기초 문제를 다시 풀어보고 dp로 다시 풀어야겠다

import java.util.*;
  
class Solution {
    public int[] solution(int N, int[] stages) {
        //N=8;
        //int[] stages={7,7,3,3,1,1,1};
        //int[] stages={1,1,1,3,3,7,7};
        int[] real = new int[N];
        for(int i=0; i<N;i++){
            real[i]=i+1;
        }
        
        double[] answer = new double[N];
        
        int flag = 0;
        double start = 0;
        Arrays.sort(stages);
        //5 1,2,2,2,3,3,4,6
        //4 4,4,4,4,4
        //8 1,1,3,3,6,6,7
        //8 1,1,1,3,3,7,7
        for(int i=0; i<stages.length; i++){
            if(stages[i]>N) {
                answer[flag] = answer[flag]/(stages.length - start);
                break;
            }

            
            if(flag+1 == stages[i]){
                answer[flag]++;
            }
            else if(flag+1 < stages[i]) {
                answer[flag] = answer[flag]/(stages.length - start);
                start=i;
                
                flag=stages[i]-1;
                answer[flag]++;
            }
            
            if(i==stages.length-1) {
                answer[flag] = answer[flag]/(stages.length - start);
            }
        }
        
        if(N>stages[stages.length-1]){
            for(int i=stages[stages.length-1]; i<N;i++)
                answer[i]=0;
        }
        
        double temp;
        int tt;
        
        for(int i=real.length-1; i>0; i--){
            for(int j=0; j<i; j++){
                if(answer[j+1]>answer[j]){
                    temp=answer[j+1];
                    answer[j+1]=answer[j];
                    answer[j]=temp;
                    
                    tt=real[j+1];
                    real[j+1]=real[j];
                    real[j]=tt;
                }
            }
        }
        for(int i=0; i<real.length; i++){
            System.out.println(real[i]+" / "+answer[i]);
        }
        return real;
    }
}