글 작성자: bbangson
반응형

https://programmers.co.kr/learn/courses/30/lessons/85002

 

코딩테스트 연습 - 6주차_복서 정렬하기

복서 선수들의 몸무게 weights와, 복서 선수들의 전적을 나타내는 head2head가 매개변수로 주어집니다. 복서 선수들의 번호를 다음과 같은 순서로 정렬한 후 return 하도록 solution 함수를 완성해주세요

programmers.co.kr

복서 정렬하기


 

난이도 :  Level 1

 

 오름차순, 내림차순과 같은 단순한 정렬이 아닌 직접 정렬을 커스텀하여 해결하는 유형의 문제입니다. 몇 가지 예외처리에 조금 애를 먹었지만 높은 난이도를 요구하는 문제는 아닙니다. 

 

 저는 아래와 같은 로직으로 문제를 해결하였습니다. 

1. 선수의 정보를 저장할 객체를 생성한다. 

2. 문제의 조건에 따라 Comparator 인터페이스를 활용하여 정렬을 구현한다. 

 

 

 

- class info{ }

 선수의 정보를 저장할 객체입니다. 선수의 번호, 무거운 상대방을 이긴 횟수, 몸무게, 승률을 저장합니다. 

 

 

 

- int[] solution(int[] weights, String[] head2head)

 info 객체 타입의 scores 배열을 생성합니다. setScores, sortScores 함수를 호출하여 scores 배열을 업데이트합니다. 

마지막으로 answer 배열에 정렬된 scores배열의 선수 번호를 저장합니다. 

 

 

 

 

- info[] sortScores(info[] scores)

 문제에 주어진 조건대로 정렬을 구현합니다. winRate는 double형 변수이므로 두 객체의 계산 값이 음수, 양수에 따라 int 값을 반환하도록 구현하였습니다. 

 

 

 

 

- info[] setScores(info[] scores, int[] weights, String[] head2head)

 주어진 정보(입력)를 토대로 scores 배열에 값을 입력합니다.

여기서 주의할 점은 승률을 구하는 부분입니다. 기존에는 total과 win 변수를 int형으로 기존에는 처리하여 계산하였지만 모든 테스트 케이스를 통과할 수 없었습니다. 그래서 아예 승률을 구할 때 필요한 변수는 double형으로 바꿔주어 계산하였습니다.

 

 

  코드
import java.util.Arrays;
import java.util.Comparator;

class Solution {
    public int[] solution(int[] weights, String[] head2head) {
        int[] answer = new int[weights.length];
        
        info[] scores = new info[weights.length];
        
        scores = setScores(scores, weights, head2head);
        scores = sortScores(scores);
        
        for(int i=0; i<scores.length; i++) {
        	answer[i] = scores[i].player;
        }
        return answer;
    }
    
    public info[] sortScores(info[] scores) {
    	
    	Arrays.sort(scores, new Comparator<info>() {
			@Override
			public int compare(info o1, info o2) {
				// 승률이 같으면 
				if(o1.winRate == o2.winRate) {
					// 무거운 복서를 이긴 회수도 같으면 
					if( o1.weightWin == o2.weightWin) {
						// 몸무게도 같으면 
						if(o1.weight == o2.weight) {
							return o1.player - o2.player;
						}
						return o2.weight - o1.weight;
					}
					return o2.weightWin - o1.weightWin;
				}
                		// double형 계산을 int형으로 반환
				if(o2.winRate - o1.winRate < 0) {
					return -1;
				}
				else if(o2.winRate - o1.winRate > 0) {
					return 1;
				}
				return 0;
			}
    	});
    	
    	return scores;
    }
    
    public info[] setScores(info[] scores, int[] weights, String[] head2head) {
        for(int i=0; i<head2head.length; i++) {
        	double win=0.0; // 이긴 횟수 
        	double total=0.0; // 이기고 진 총 횟수 (N 제외)
        	double winRate=0.0; // 승률 
        	int weightWin = 0; // 무거운 상대방을 이긴 횟수 
        	int weight = weights[i]; // 자기 몸무게 
        	int player = i+1; // 자기 번호 
        	char status; // N, W, L 상태
        	for(int j=0; j<head2head[i].length(); j++) {
        		if(i == j) continue;
        		
        		status = head2head[i].charAt(j);
        		if(status == 'W' || status == 'L') total++;
        		if(status == 'W') {
        			win++;
        			if(weight < weights[j]) weightWin++;
        		}
        	}
        	if(total != 0.0) {
        		winRate = win / total ;
        	}
        	scores[i] = new info(player, winRate, weightWin, weight);
        }
    	return scores;
    }
}
    class info {
    	int player, weightWin, weight;
    	double winRate;
    	public info(int player, double winRate, int weightWin, int weight) {
    		this.player = player;
    		this.winRate = winRate;
    		this.weightWin = weightWin;
    		this.weight = weight;
    	}
    }

 

 

 

 

 

피드백 환영합니다.

반응형