실패율, java

NJW·2022년 6월 1일
0

코테

목록 보기
90/170

들어가는 말

예전에 푼 적이 있는 카카오의 실패율이다. 전에는 C++로 풀었다면 이번에는 java로 풀었다. 기본 풀이는 알고 있었지만, 구현에 어려움을 겪었던 이유는 바로 java에서 pair을 구현하는 거 때문이었다.

코드 설명

C++과 다르게 java는 버전에 따라 pair을 제공하지 않는다. 블로그에서는 pair을 class로 구현해서 사용하라고 했기에 클래스를 따로 만들어줬다.

다음은 정렬이었다. Collections에서 sort를 이용하려고 했는데, 예전에 comparable을 이용한 람다식 return e1 - e2를 이용하면 오류가 나는 것이었다. 그래서 비교에는 Double.compare을 사용했다.
뿐만 아니라 rate를 내림차순으로 정렬하는 데도 문제가 생겼다. 이것은 return 값에 마이너스를 붙여서 해결했다. java는 기본적으로 오름차순을 지원해서 음수가 나오면 순서를 바꾸지 않고 양수가 나오면 순서를 바꾸는 식이다. 만일 여기서 마이너스를 붙여서 기호를 바꿔주면 자연스럽게 내림차순으로 정렬하는 아이디어를 생각했다.

마지막으로 answer 배열에다가 정렬한 pair의 idx를 넣어주면 된다.

코드

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;

class Solution {
    
    /*pair을 만드는 클래스
    */
    	static class pair{
		int idx;
		double rate;
		
		public pair(int idx, double rate) {
			this.idx = idx;
			this.rate = rate;
			// TODO Auto-generated constructor stub
		}
	}
    
    public int[] solution(int N, int[] stages) {
        int challenge = 0;
		int fail = 0;
        int pass = 0;
        int[] answer = new int[N];
        
        ArrayList<pair> arr = new ArrayList<>();
        
        for(int i=1; i<=N; i++) {
			for(int j=0; j<stages.length; j++) {
				if(stages[j] >= i) {
					challenge++;
				}
				if(stages[j] == i) {
					fail++;
				}
			}
            if(challenge == 0){
                arr.add(new pair(i, 0.0));
            }else{
                double tmp_rate = (double) fail/challenge;
			    arr.add(new pair(i, tmp_rate));
            }
			challenge = 0;
			fail = 0;
		}
        
        Collections.sort(arr, (e1, e2) -> {
			return -Double.compare(e1.rate, e2.rate);
		});
        
        for(int i=0; i<arr.size(); i++) {
			answer[i] = arr.get(i).idx;
		}
        
        return answer;
    }
}
profile
https://jiwonna52.tistory.com/

0개의 댓글