PS/이코테

[이코테][Java] 실패율

nyrimmm 2025. 1. 12. 18:04

문제링크 : https://school.programmers.co.kr/learn/courses/30/lessons/42889

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


문제 설명

슈퍼 게임 개발자 오렐리는 신규사용자와 기존 사용자 사이에 스테이지 차이가 큰 문제를 해결하기 위해서 동적으로 게임 시간을 늘려 난이도를 조절하기로 한다. 오렐리를 위해 실패율을 구하는 코드를 완성하시오.

실패율 = (스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수) / (스테이지에 도달한 플레이어의 수)

실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담긴 배열을 return한다.

 

입력조건

  • 전체 스테이지의 수 N
  • 게임을 이용하는 사용자가 현재 멈춰있는 스테이지 번호가 담긴 배열 stages

출력조건

  • 실패율이 높은 스테이지부터 내림차순으로 스테이지 번호가 담긴 배열 출력

입출력 예시

입력예시 출력예시
5
[2, 1, 2, 6, 2, 4, 3, 3]
[3, 4, 2,1, 5]
4
[4, 4, 4, 4, 4]
[4, 1, 2, 3]

 

 

 

 

문제 풀이

  • int[] stages : 각 사용자가 현재 멈춰있는 스테이지의 번호가 담긴 배열
    - 배열 값이 4: 스테이지 3까지 클리어하고, 스테이지 4는 클리어하지 못한 상태
    - 배열 값이 N+1 : 마지막 스테이지까지 모두 클리어한 상태
  • 실패율 = (스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수) / (스테이지에 도달한 플레이어의 수)
    • 스테이지 i에 도달했으나 아직 클리어하지 못한 플레이어의 수
      현재 멈춰있는 스테이지 번호i인 플레이어의 수
    • 스테이지 i에 도달한 플레이어의 수
      현재 멈춰있는 스테이지 번호 i보다 크거나 같은 플레이어의 수
  • 실패율을 기준으로 내림차순 정렬, 실패율이 같다면 스테이지 번호를 기준으로 오름차순 정렬
import java.io.*;
import java.util.*;

class Solution {
    public int[] solution(int N, int[] stages) {
        double[][] failRate = new double[N][2]; //스테이지 번호와 실패율을 담는 배열
        int[] result = new int[N];

        int totalPlayers = stages.length;     //스테이지에 도달한 플레이어 수
        for (int i = 1; i <= N; i++) {
            int challengers = 0;            //스테이지에 도달했으나 아직 클리어하지 못한 플레이어 수
            for (int j = 0; j < stages.length; j++) {
                if (i == stages[j]) {   //현재 스테이지와 같으면 클리어하지 못한 플레이어수 증가
                    challengers++;
                }
            }

            failRate[i - 1][0] = i; //스테이지 번호
            //실패율
            if (totalPlayers == 0) {    //totalPlayers가 0이면 실패율 0.0
                failRate[i-1][1] = 0.0;
            } else {
                failRate[i - 1][1] = (double) challengers / (double) totalPlayers;
            }
            totalPlayers -= challengers;
        }


        Arrays.sort(failRate, new Comparator<double[]>() {
            @Override
            public int compare(double[] o1, double[] o2) {
                if (o1[1] == o2[1]) {   //실패율이 같다면 스테이지번호 기준으로 오름차순 정렬
                    return Double.compare(o1[0], o2[0]);
                } else {                //실패율 기준으로 내림차순 정렬
                    return Double.compare(o2[1], o1[1]);
                }
            }
        });

        //스테이지 번호만 result 배열에 저장
        for (int i = 0; i < failRate.length; i++) {
            result[i] = (int) failRate[i][0];
        }

        return result;
    }
}

[참고서적]

이것이 취업을 위한 코딩 테스트다 with 파이썬 by 나동빈