코딩테스트 연습(2차)

Montag·2023년 4월 16일

코딩테스트 연습

목록 보기
2/2

문제집: 2019 KAKAO BLIND RECRUITMENT

[LV. 1]

1. 실패율

생각한 문제 유형 : 자료형 계산, 저장하기, 출력하기
소요 시간: 약 50분

막혔던 부분 :

  • 정렬하는 부분에서 굉장히 많이 소요되었다. 진짜 풀만해 보였는데, 어떻게 값을 저장할지가 헷갈려서 많은 시간이 들었음
    list나 배열에 값을 저장하고 정렬하는 부분을 더 자세히 알아야겠다

해결 :

  • HashMap을 써야하나 고민했다가, HashMap 정렬 방법을 도저히 모르겠어서, List로 변환하였음
    원래 Node class를 생성해서 PriorityQueue로 출력하면 될 줄 알고 그렇게 진행했는데, Comparable이 잘 안되서 포기
    ArrayList에 double형의 배열을 넣고, sort와 람다식을 이용해서 1번 인덱스 기준 정렬을 시켰음

  • Lv.1인데 쉽지가 않았다... 우선 sum에는 각 라운드별 남은 사람의 수를 저장. count는 stages 배열의 값을 counting 정렬하듯
    정렬해 주었음. 그리고 double형 배열을 list에 넣고, 앞에는 스테이지 수, 뒤에는 double로 변환한 실패율을 저장하였다
    또한 sum이 0인 경우가 생기기 때문에, sum[idx]의 값이 0인 경우 오류를 배제하기 위해 0인 경우는 0으로 처리해주었다

코드

import java.util.*;

class Solution {
    public int[] solution(int N, int[] stages) {
        int[] answer = new int[N];
        int[] sum = new int[N+1];
        int[] count = new int[N+1]; // N+1 은 N스테이지까지 클리어한 사람이 있음
        
        ArrayList<double[]> list = new ArrayList<>();
        
        for(int i = 0; i < stages.length; i++) {
            count[stages[i]-1]++;
        }
        
        sum[0] = stages.length;
        for(int i = 1; i < N+1; i++){
            sum[i] = sum[i-1] - count[i-1];
        }
    
        for(int i =0; i < N; i++){
            if(sum[i] == 0 ){
                list.add(new double[] {i+1, 0});
            } else{
                list.add(new double[] {i+1, (double) count[i]/(double) sum[i]}) ;   
            }
        }
        
        list.sort((a,b) -> Double.compare(b[1],a[1]));
        for(int i = 0; i < list.size(); i++){
            answer[i] = (int) list.get(i)[0];
        }
        
        return answer;
    }
}



진행중

profile
블로그 이사 -> https://seopdo.tistory.com/

0개의 댓글