[프로그래머스] 실패율

김서영·2021년 12월 23일

코딩테스트 스터디

목록 보기
4/11

실패율

돌았다...카카오 2019? 문제라던데....
레벨 1짜리인데......
아....
자바 처음부터 다시 하는 수준이라...문제 푸는 데 이틀 걸림...

1차 시도

  • 모든 테스트 케이스가 다 런타임 에러 남...

내가 가장 먼저 생각한 코드...
사실 실패율을 배열로 만든 것까지는 다 됨.
그걸 어떻게 인덱스 순으로 정렬하는지가 관건이었다.
근데 그게 하도 안돼서 진짜 개고생개고생을 함...파이썬이라면 어찌어찌했을텐데 자바라서 하도 문법이 생각이 안 났음...
근데 막상 돌려보니 런타임 에러밖에 안남.

import java.util.*;
class Solution {
    public static int[] solution(int N, int[] stages) {
        int[] answer = new int[N];
        int people = stages.length;
        int clear = people;
        Arrays.sort(stages);
        Float [] failure = new Float[N];

        for (int i=1; i<=N; i++){
            int fail = 0;
            for (int j=0; j<people; j++){
                if (stages[j] == i) fail ++;
                else if (stages[j] > i) break;
            }
            float result = (float)fail/clear;
            failure[i-1] = result;
            clear -= fail;
        }

        Float [] failure2 = new Float[N];
        System.arraycopy(failure,0,failure2,0,N);
        Arrays.sort(failure2, Collections.reverseOrder());

        int [] path = new int[5];
        for (int x=0; x<N; x++){
            for (int y=0; y<N; y++){
                if (failure2[x] == failure[y]){
                    answer[x] = y+1;
                    path[x] = y;
                    break;
                }
            }
        }

        System.out.println(Arrays.toString(failure));
        System.out.println(Arrays.toString(failure2));
        System.out.println(Arrays.toString(answer));
        return answer;
    }
    public static void main(String [] args) {
        int [] arr = {2, 1, 2, 6, 2, 4, 3, 3};
        System.out.println(solution(5,arr));
        }
}

2차 시도

  • 70.4점

1차 시도에서 실패율까지는 성공적으로 구했으니까 그걸 정렬을 좀 더 용이하게 하기 위해서 2차원 배열을 이용함! 원래 실패율 구한 그 배열을 1차원-> 2차원으로 바꿔어서 [i][0]번째에는 스테이지 인덱스 값을 [i][1]번째에는 실패율을 넣기로 함.
2차원 배열 정렬하는 문법이 정말 새로웠음....이것도 외워야 한다니..!
아무튼 근데 돌렸는데 70.4 점이 나온거임.

import java.util.*;
class Solution {
    public static int[] solution(int N, int[] stages) {
        int[] answer = new int[N];
        int people = stages.length;
        int clear = people;
        Arrays.sort(stages);
        Double [][] failure = new Double[N][2];
        for (int i=1; i<=N; i++){
            int fail = 0;
            for (int j=0; j<people; j++){
                if (stages[j] == i) fail ++;
                else if (stages[j] > i) break;
            }
            failure[i-1][0] = (double)i;
            failure[i-1][1] = (double)fail/clear;
            clear -= fail;
        }

       
        Arrays.sort(failure, (o1, o2) -> {
            if(o1[1] == o2[1]){
                return Double.compare(o2[0], o1[0]);
            }else{
                return Double.compare(o2[1], o1[1]);
            }
        });
        for (int i=0; i<failure.length; i++){
            answer[i] = failure[i][0].intValue();
        }
        return answer;
    }
    public static void main(String [] args) {
        int [] arr = {2, 1, 2, 6, 2, 4, 3, 3};
        System.out.println(solution(5,arr));
        }
}

3차 시도

  • 100 점 성공...

2차 시도가 끝일 줄 알았는데 내 코드의 정확도가 70.4라는 사실이 너무 짜증나서 다른 사람 코드를 볼까 고민했음.
근데 다른 사람 코드 봐도 어차피 또 내 코드랑 다르니까 헷갈릴 게 분명함.
그래서 그냥 테스트코드 예시를 검색함.
다행히 어떤 블로그에서 N=8, {1,2,3,4,5,6,7} 예시를 해 보라고 했고,
내 코드의 문제점을 발견(!)

내 코드에서는 한 명도 도달하지 않은 스테이지에 대한 고려가 전혀 없었음.
N=8, {1,2,3,4,5,6,7} 예시의 경우, 한 명도 스테이지 8까지 못 간 케이스임. 근데 내가 이걸 고려하지 않았으니, 다시 실패율 구하는 부분에서 코드만 한 줄 더 추가함.

import java.util.*;
class Solution {
    public static int[] solution(int N, int[] stages) {
        int[] answer = new int[N];
        int people = stages.length;
        int clear = people;
        Arrays.sort(stages);
        Double [][] failure = new Double[N][2];
        for (int i=1; i<=N; i++){
            int fail = 0;
            for (int j=0; j<people; j++){
                if (stages[j] == i) fail ++;
                else if (stages[j] > i) break;
            }
            failure[i-1][0] = (double)i;
            if (clear == 0) failure[i-1][1] = 0.0;
            else failure[i-1][1] = (double)fail/clear;
            clear -= fail;
        }

        //Arrays.sort(failure, Comparator.comparingDouble(o1 -> o1[1]));
        Arrays.sort(failure, (o1, o2) -> {
            if(o1[1] == o2[1]){
                return Double.compare(o2[0], o1[0]);
            }else{
                return Double.compare(o2[1], o1[1]);
            }
        });
        for (int i=0; i<failure.length; i++){
            //System.out.println(failure[i][0].intValue()+" " + failure[i][1]);
            answer[i] = failure[i][0].intValue();
        }
        System.out.println(Arrays.toString(answer));
        return answer;
    }
    public static void main(String [] args) {
        int [] arr = {1,2,3,4,5,6,7};
        System.out.println(solution(8,arr));
        }
}
profile
하지만 저는 이겨냅니다. 김서영이죠?

0개의 댓글