본문 바로가기
코딩테스트/카카오

실패율

by 일상 속 둔치 2020. 3. 22.

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

배열을 다루는 문제이다. 간단하게 요약하면 배열에서 각 스테이지보다 더 전진한 유저수를 다 더하고 해당 스테이지에 머물고 있는 유저수를 세서 실패율을 구하고 실패율을 Sorting하면 완료된다.

 

이번에도 각 스테이지의 유저수를 핸들링하기 위해 클래스를 생성하였다. (지금 보니 클래스명이 Stage가 더 적절한거 같은데...)

class Score {
    int endPlayer;
    int nowPlayer;
    
    Score(){
        endPlayer = 0;
        nowPlayer = 0;
    }
}

 

Score 배열을 스테이지 수만큼 만들어주고 반복문을 통해 각 스테이지의 유저수를 카운팅해주었다.

	double biggestRate = 0;
        int index = 0;
        
        for(int i = 0; i < N; i++) {
        	biggestRate = -1;
    		index = -1;
        	for(int j = 0; j < N; j++) {
        		if(check[j] == false && biggestRate < rate[j]) {
        			biggestRate = rate[j];
        			index = j;
        		}
        	}
        	answer[i] = index+1;
        	check[index] = true;
        }
        
        return answer;

 

이후 실패율을 계산하고 가장 큰 스테이지부터 answer 배열에 넣어주었다.

	for(int i = 0; i < N; i++) {
        	scoreArr[i] = new Score();
        }
    	/* 현재 플레이어 위치 카운팅 */
        for(int i = 0; i < stages.length; i++){
            if(stages[i]<N+1){
                scoreArr[stages[i]-1].nowPlayer++;
            }
            else{
                allClearPlayer++;
            }
        }
        
        /* 스테이지에 도달한 플레이어 저장 */
        for(int i = 0; i < N; i++) {
        	for(int j = i; j < N; j++) {
        		scoreArr[i].endPlayer += scoreArr[j].nowPlayer;
        	}
        	scoreArr[i].endPlayer += allClearPlayer;
        	if(scoreArr[i].endPlayer == 0) {
        		rate[i] = 0;
        	}
        	else {
        		rate[i] = (double)scoreArr[i].nowPlayer / scoreArr[i].endPlayer;
        	}
        	
        }

 

이번 문제도 쉬운 문제였다. 다만 N+1 스테이지 라던가 스테이지에 도달한 유저가 없는 경우 실패율을 0으로 정의하는 등 여러 제한사항을 놓치면 안된다.

 

아래는 코드 전문이다.

import java.util.*;

class Solution {
    public int[] solution(int N, int[] stages) {
        int[] answer = new int[N];
        Score[] scoreArr = new Score[N];
        int allClearPlayer = 0;
        double[] rate = new double[N];
        boolean[] check = new boolean[N];

        Arrays.fill(check, false);
        for(int i = 0; i < N; i++) {
        	scoreArr[i] = new Score();
        }
    	/* 현재 플레이어 위치 카운팅 */
        for(int i = 0; i < stages.length; i++){
            if(stages[i]<N+1){
                scoreArr[stages[i]-1].nowPlayer++;
            }
            else{
                allClearPlayer++;
            }
        }
        
        /* 스테이지에 도달한 플레이어 저장 */
        for(int i = 0; i < N; i++) {
        	for(int j = i; j < N; j++) {
        		scoreArr[i].endPlayer += scoreArr[j].nowPlayer;
        	}
        	scoreArr[i].endPlayer += allClearPlayer;
        	if(scoreArr[i].endPlayer == 0) {
        		rate[i] = 0;
        	}
        	else {
        		rate[i] = (double)scoreArr[i].nowPlayer / scoreArr[i].endPlayer;
        	}
        	
        }
        
        double biggestRate = 0;
        int index = 0;
        
        for(int i = 0; i < N; i++) {
        	biggestRate = -1;
    		index = -1;
        	for(int j = 0; j < N; j++) {
        		if(check[j] == false && biggestRate < rate[j]) {
        			biggestRate = rate[j];
        			index = j;
        		}
        	}
        	answer[i] = index+1;
        	check[index] = true;
        }
        
        return answer;
    }
}

class Score {
    int endPlayer;
    int nowPlayer;
    
    Score(){
        endPlayer = 0;
        nowPlayer = 0;
    }
}

 

'코딩테스트 > 카카오' 카테고리의 다른 글

뉴스 클러스터링  (0) 2020.03.29
문자열 압축  (0) 2020.03.29
다트 게임  (0) 2020.03.22
비밀지도  (0) 2020.03.21

댓글