본문 바로가기
알고리즘/프로그래머스

[프로그래머스 / 실패율 / JAVA]

by KDW999 2023. 3. 15.

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

 

프로그래머스

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

programmers.co.kr

 

문제 접근

Map에다가 해당 스테이지 번호 키에 실패율을 담아서 사용하였다.

Map에는 keySet()으로 Map이 가지고 있는 key들을 출력 가능한 메소드가 있는데 해당 메소드로 실패율이 제일 높은 스테이지를 검사해서 해당 스테이지를 배열에 담고 return

문제를 풀다가 해당 스테이지 아무도 가지 못했을 때 실패율이 0 / 0이 나오는 경우가 있는데 내 지식선에선 이게 그냥 0으로만 생각되는데 자바에선 이런 계산식은 NaN으로 인식한단다.

그래서 찾아보니 다른 사람은 0 / 0 계산이 나올 경우 변수를 1로 만들어서 0 / 1 계산식이 나오게 만들어 줬더라

import java.util.*;

class Solution {
    public int[] solution(int N, int[] stages) {
        int[] answer = new int[N];
        
        Map<Integer, Double> failRate = new HashMap<>(); // 스테이지 번호와 실패율을 담을 Map
        
        for(int i=1; i<=N; i++) { // 스테이지
        	double clearPlayer = 0;
            double stayPlayer = 0;
            
        	for(int j=0; j<stages.length; j++) { // 각 배열돌며 숫자 확인
        		if(stages[j] > i) clearPlayer++;
        		if(stages[j] == i) stayPlayer++;
        	}
        	if(stayPlayer == 0 && clearPlayer == 0) clearPlayer = 1; // 자바에선 0 / 0을 하면 NaN이 뜬단다. 
        	                                                         // 해당 스테이지 도착한 인원이 아무도 없을 땐 0 / 0을 방지하기위해 clearPlayer를 1로 만들어줌
            
        	failRate.put(i, stayPlayer / (stayPlayer + clearPlayer)); // 스테이지에 실패율 담기
        }
        
        for(int i=0; i<N; i++) {
        	double maxNum = -1; // 제일 큰 실패율
            int stage = 0;
            
             for(int k : failRate.keySet()) { // 모든 실패율 비교
        	    if(failRate.get(k) > maxNum) { // 순서대로 실패율을 비교하기에 같은 값이 있더라도 먼저 온 값을 저장하게 된다
        	    	maxNum = failRate.get(k); // 바뀌지 않으면 현재 stage가 가장 큰 실패율을 가짐
        	    	stage = k;
        	    }
             }
             answer[i] = stage; // 최고 실패율을 가진 스테이지 차례대로 저장
             failRate.remove(stage);  // 현재 스테이지 삭제하고 남은 스테이지끼리 비교
        }

        return answer;
    }
}

 

다른 사람 풀이

처음에 떠올렸던 실패율에 상응하는 새로운 배열을 만들어서 실패율의 크기에 따라 같이 위치가 바뀌는 배열로 문제를 풀고 싶었는데 풀다가 헷갈려서 Map으로 노선을 바꿨었다.

이 분은 내가 풀고싶어했던 방식으로 푸셨다.

많이 풀면 이런 사고가 자연스레 생길까?

class Solution {
	public int[] solution(int N, int[] stages) {
        int[] answer = new int[N];
        double[] tempArr = new double[N]; // 실패율 배열
        int arrLength = stages.length; // 전체 참가 인원
        int idx = arrLength; // 전체 참가 인원
        double tempD = 0;
        int tempI = 0;
       
        for (int i = 0; i < arrLength; i++) { // 해당 스테이지에 몇 명있는지 찾는 for문인 듯
            int stage = stages[i];
            if (stage != N + 1)
                answer[stage - 1] += 1; // 2stage면 answer 배열에선 1번 째 자리
        }
        for (int i = 0; i < N; i++) {
            int personNum = answer[i];
            tempArr[i] = (double) personNum / idx; // 실패율 
            idx -= personNum; // 첫 스테이지 실패율 구한 후 다음 스테이지부턴 이전 스테이지 실패자 수는 빼고 계산
            answer[i] = i + 1; // N이 5면, 1 2 3 4 5 차례대로 저장
        }

        for (int i = 0; i < N; i++) {
            for (int j = 1; j < N - i; j++) {
                if (tempArr[j - 1] < tempArr[j]) { // 0번 째 요소에 제일 큰 값을 옮기는 연산
                    tempD = tempArr[j - 1];
                    tempArr[j - 1] = tempArr[j];
                    tempArr[j] = tempD;

                    tempI = answer[j - 1];  // 해당 조건문이 실행되면 answer 배열도 상응하는 스테이지 번호가 바뀜
                    answer[j - 1] = answer[j];
                    answer[j] = tempI;
                }
            }
        }
        return answer;
    }
}

 

댓글