본문 바로가기
알고리즘

[프로그래머스/JAVA] 복서 정렬하기

by 상후 2021. 9. 13.
728x90
반응형

 

 

https://github.com/ROUTINE-STUDY/Algorithm

알고리즘 스터디를 진행하고 있습니다. 😊
초보들로 구성되어있으며, 열심히 풀어보고 풀이 방식을 공유하고 피드백을 해주는 스터디입니다.
참여 문의는 댓글 혹은 GitHub 주소를 참고해주세요.

문제 출처 : https://programmers.co.kr/learn/courses/30/lessons/85002

 

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

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

programmers.co.kr

문제 설명

출처 : 프로그래머스

요구사항에 맞게 정렬하여 반환하세요.
풀이 방법
정렬을 하기 위한 지표가 정해져 있습니다.
[승률, 체급 차 극복 승리 횟수, 몸무게, 번호] - 번호를 제외한 나머지 모두 내림차순입니다.

1. 위 지표를 가지고 있는 Player라는 class를 작성합니다.
2. 지표를 구한 뒤 해당 각 Player를 List에 담아줍니다.
3. Collections.sort()와 Comparator를 이용하여 요구사항에 맞도록 정렬해줍니다.
4. 정렬된 List로 return 배열을 만들어 반환합니다. 
내 코드(JAVA)

 

// 1. 지표를 가지고있는 Player class 작성
class Player {
    int no;
    int weight;
    double winRate;
    int overCount;

    public Player(int no, int weight, double winRate, int overCount) {
        this.no = no;
        this.weight = weight;
        this.winRate = winRate;
        this.overCount = overCount;
    }
}

public class Sanghoo {

    public int[] solution(int[] weights, String[] head2head) {
        int[] answer = new int[weights.length];
        List<Player> records = new ArrayList<>();

        // 2. 각종 지표 구하기(승률, 체급차 승리 횟수) + Player를 List에 담기
        for(int i=0; i<head2head.length; i++) {
            double winCount = 0.0;
            double totalCount = 0.0;
            int overCount = 0;
            char[] recordArray = head2head[i].toCharArray();

            for(int j=0; j<recordArray.length; j++) {
                if(recordArray[j] != 'N') {
                    totalCount++;   // 경기 수
                    if(recordArray[j] == 'W') {
                        winCount++; // 승리 수
                        if(weights[i] < weights[j]) overCount++;    // 체급 차 승리 수
                    }
                }
            }

            double winRate = winCount/totalCount;   // 승률
            Player player = new Player(i+1, weights[i], winRate, overCount);
            records.add(player);
        }

        // 3. 요구사항대로 정렬하기
        Collections.sort(records, new Comparator<Player>() {
            @Override
            public int compare(Player p1, Player p2) {
                // 승률 내림차순
                if(p1.winRate > p2.winRate) return -1;
                else if(p1.winRate < p2.winRate) return 1;
                else { // 승률 같다면, 체급 차 승리 수 내림차순
                    if(p1.overCount > p2.overCount) return -1;
                    else if(p1.overCount < p2.overCount) return 1;
                    else { // 같다면, 몸무게 내림차순
                        if(p1.weight > p2.weight) return -1;
                        else if(p1.weight < p2.weight) return 1;
                        else { // 같다면, 번호(이름) 오름차순
                            if(p1.no > p2.no) return 1;
                            else if(p1.no < p2.no) return -1;
                        }
                    }
                }
                return 0;
            }
        });

        // 4. return 배열 만들기(player의 번호)
        for(int i=0; i<records.size(); i++) {
            Player player = records.get(i);
            answer[i] = player.no;
        }

        return answer;
    }

}

 

3번의 요구사항대로 정렬하는 코드를 줄일 수 있는 리팩토링이 가능할 것 같다.

 

 

 

 

728x90
반응형

댓글