[Programmers] : 실패율 - Java

🔗 문제 

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

 

코딩테스트 연습 - 실패율

실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스

programmers.co.kr

 

💻 코드

package org.kyhslam.programmers;

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

public class day_1217_01 {

    public static boolean[] visited;

    public static class Rate {
        private int idx;
        private double rate;

        public Rate(int idx, double rate) {
            this.idx = idx;
            this.rate = rate;
        }
    }

    public static class RateCompare implements Comparator<Rate> {
        @Override
        public int compare(Rate o1, Rate o2) {
            //return o1.rate > o2.rate ? -1 : 1;
            // 실패율이 같을 때
            if(o1.rate == o2.rate)
            {
                return o1.idx < o2.idx ? -1:1;
            }
            // 실패율이 다를 때 내림차순 정렬
            else if(o1.rate> o2.rate)
            {
                return -1; // -1 : 오름차순 ||| 1 : 내림차순
            }
            else
            {
                return 1;
            }
        }
    }

    public static void main(String[] args) {

        int N = 5;
        int[] stages = {2, 1, 2, 6, 2, 4, 3, 3};
        //int[] stages = {4,4,4,4,4};

        // [4,1,2,3]

        int[] result = solution(N, stages);
        System.out.println("--- result = " + Arrays.toString(result));

    }


    public static int[] solution(int N, int[] stages) {
        int[] answer = new int[N];
        visited = new boolean[stages.length];

        ArrayList<Rate> list = new ArrayList<>();

        for (int i = 1; i <= N; i++) {

            int fail = 0;
            Integer all = 0;

            for(int j=0; j < stages.length; j++) {

                if(visited[j] == false) {
                    if(i >= stages[j]) {
                        visited[j] = true;
                        fail++;
                    }
                    all++;
                }
            }

            Rate r = new Rate(i, fail/ all.doubleValue());
            list.add(r);
        }

        Collections.sort(list, new RateCompare());
        //System.out.println("list = " + list);
        list.forEach(c -> System.out.println(c.idx + " : " + c.rate));

        for (int i = 0; i < list.size(); i++) {
            answer[i] = list.get(i).idx;
        }

        return answer;
    }
}

 

다른방법

import jdk.swing.interop.SwingInterOpUtils;

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

public class day_1217_02 {

    public static class Rate {
        private int idx;
        private double rate;

        public Rate(int idx, double rate) {
            this.idx = idx;
            this.rate = rate;
        }
    }

    public static class RateCompare implements Comparator<Rate> {
        @Override
        public int compare(Rate o1, Rate o2) {
            //return o1.rate > o2.rate ? -1 : 1;
            // 실패율이 같을 때
            if(o1.rate == o2.rate)
            {
                return o1.idx < o2.idx ? -1:1;
            }
            // 실패율이 다를 때 내림차순 정렬
            else if(o1.rate> o2.rate)
            {
                return -1; // -1 : 오름차순 ||| 1 : 내림차순
            }
            else
            {
                return 1;
            }
        }
    }

    public static void main(String[] args) {

        int N = 5;
        int[] stages = {2, 1, 2, 6, 2, 4, 3, 3};
        //int[] stages = {4,4,4,4,4};

        // [4,1,2,3]

        int[] result = solution(N, stages);

        System.out.println("Arrays.toString(result) = " + Arrays.toString(result));

    }


    public static int[] solution(int N, int[] stages) {
        int[] answer = new int[N];

        int[] user_cnt = new int[N+2];
        int[] user_total_cnt = new int[N+1];



        for (int i = 0; i < stages.length; i++) {
            user_cnt[stages[i]]++;
        }
        System.out.println(Arrays.toString(user_cnt));

        user_total_cnt[N] = user_cnt[N] + user_cnt[N+1];
//        System.out.println("Arrays.toString(user_total_cnt) = " + Arrays.toString(user_total_cnt));
        for (int i = N - 1; i >= 1; i--) {
            System.out.println(i + "=> " + user_cnt[i] + " + " + user_total_cnt[i + 1]);
            user_total_cnt[i] = user_cnt[i] + user_total_cnt[i + 1];
        }

        ArrayList<Rate> list = new ArrayList<>();

        for (int i = 1; i <= N; i++) {
            if (user_total_cnt[i] == 0) {
                list.add(new Rate(i, 0));
                continue;
            }

            double rate = (double) user_cnt[i] / user_total_cnt[i];
            list.add(new Rate(i, rate));
        }

        Collections.sort(list, new RateCompare());

        System.out.println("list = " + list);
        list.forEach(o -> System.out.println(o.idx + " :: " + o.rate));

        for (int i = 0; i < list.size(); i++) {
            answer[i] = list.get(i).idx;
        }

        return answer;
    }
}

댓글

Designed by JB FACTORY