본문 바로가기

컴퓨터/프로그래머스

프로그래머스 - 42889번: 실패율 [Java]

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

 

프로그래머스

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

programmers.co.kr

1. 코드

import java.util.*;
class Solution {
    public int[] solution(int N, int[] stages) {
        int[] answer = new int[N];
        double[][] fail = new double[N][2];
        int temp = stages.length;
        
        for(int i = 0; i < N; i++) {
            fail[i][1] = (double)(i + 1);
            int cnt = 0;
            for(int j = 0; j < stages.length; j++) {
                if((i + 1) == stages[j]) {
                    cnt++;
                }
            }
            
            if(temp > 0)
               fail[i][0] = (double)cnt / temp;
            else
                fail[i][0] = 0;
            temp -= cnt;
        }
        
        Arrays.sort(fail, new Comparator<double[]>(){
            @Override
            public int compare(double[] f1, double[] f2) {
                if(f1[0] > f2[0])
                    return -1;
                else if(f1[0] == f2[0])
                    return 0;
                else
                    return 1;
            }
        });
        
        for(int i = 0; i < N; i++)
            answer[i] = (int) fail[i][1];
        return answer;
    }
}

2. 설명

int[] answer = new int[N];
double[][] fail = new double[N][2];
int temp = stages.length;

answer에는 정답을 fail에는 실패율과 스테이지 번호를 temp는 해당 스테이지에 도전하는 참가자들의 수이다.

for(int i = 0; i < N; i++) {
    fail[i][1] = (double)(i + 1);
    int cnt = 0;
    for(int j = 0; j < stages.length; j++) {
        if((i + 1) == stages[j]) {
            cnt++;
        }
    }

    if(temp > 0)
       fail[i][0] = (double)cnt / temp;
    else
        fail[i][0] = 0;
    temp -= cnt;
}

먼저 fail[i][1]에 스테이지 번호를 저장합니다. cnt는 해당 스테이지에서 실패한 사람들의 수입니다. 반복문을 통해서 실패한 스테이지에 남아있는 사람의 수를 측정합니다.

그리고 만약 현재 스테이지에 도전자가 더 이상 존재하지 않으면 실패율을 0으로 아니라면 (실패한 참가자 / 스테이지에 도달한 참가자)로 실패율을 저장합니다. 이러한 이유는 총 4 스테이지가 존재한다고 했을 때 1 스테이지에 모두가 남아있는 경우도 있기 때문에 n / 0이 되는 상황이 되어 오류를 방지하기 위함입니다.

마지막으로 해당 스테이지에 남아있는 참가자만큼 다음 단계 스테이지 참가자 수에 제외시킵니다.

Arrays.sort(fail, new Comparator<double[]>(){
    @Override
    public int compare(double[] f1, double[] f2) {
        if(f1[0] > f2[0])
            return -1;
        else if(f1[0] == f2[0])
            return 0;
        else
            return 1;
    }
});

실패율을 기준으로 내림차순으로 정렬합니다.

for(int i = 0; i < N; i++)
    answer[i] = (int) fail[i][1];

내림차순된 순서로 스테이지 번호를 answer 차례로 저장하면 문제는 해결됩니다.

3. 정리

  1. 문제 잘 이해하기
  2. 2차원 배열 정렬 방법 숙지
출처: 프로그래머스 코딩 테스트 연습, 
https://school.programmers.co.kr/learn/challenges