[프로그래머스](Java) - 복서 정렬하기(위클리 챌린지 6주차)

민지킴·2021년 9월 6일
0

프로그래머스

목록 보기
38/42
post-thumbnail

문제링크

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

문제풀이

정렬조건이 어렵지 않아서 Comparable을 이용해서 접근했다.
승률, 자신보다체중이 많이 나가는 상대에게 이긴 횟수, 체중, 번호를 가지고 있는 클래스를 만들고, 그 클래스를 자료형으로 가지는 ArrayList를 생성해 Boxer들을 넣어준다.
자신보다 체중이 많은 사람들에게 이긴횟수는 따로 method를 빼서 처리했다.

다 넣었다면 Collections.sort를 이용하여 정렬하면 끝난다.
정렬조건은 승률이 제일 높은사람 > 자신보다 체중이 많이 나가는 상대에게 이긴 횟수가 많은 순서 > 체중이 큰 순서대로 > 번호가 작은 사람이다.
각 조건 순서대로 compareTo를 이용하여 구현하였다.


코드

import java.util.*;

class Boxer implements Comparable<Boxer>{
    
    double winnum = 0;
    int swinnum =0;
    int weight = 0;
    int idx;
    public Boxer(double winnum,int swinnum, int weight,int idx){
        this.winnum = winnum;
        this.swinnum = swinnum;
        this.weight = weight;
        this.idx = idx;
    }
    
    public int compareTo(Boxer o){
        if(o.winnum-winnum>0){
            return 1;
        }else if(o.winnum-winnum<0){
            return -1;
        }else{
            if(o.swinnum-swinnum>0){
                return 1;
            }else if(o.swinnum - swinnum<0){
                return -1;
            }else{
                if(o.weight -weight>0){
                    return 1;
                }else if(o.weight - weight<0){
                    return -1;
                }else{
                    if(o.idx - idx<=0){
                        return 1;
                    }else{
                        return -1;
                    }
                }
            }
        }
       
    }
    
    public String toString(){
        return "boxer "+idx+"번 "+winnum+"승, 체중많은 사람한테 "+swinnum+"승";
    }
}


class Solution {
    public int[] solution(int[] weights, String[] head2head) {
        int[] answer = new int[weights.length];
        List<Boxer>boxerlist = new ArrayList();
        for(int i=0; i<answer.length; i++){
            int pan = head2head[i].replace("N","").length();
            int wincount = head2head[i].replace("N","").replace("L","").length();
           
            if(pan==0){
                boxerlist.add(new Boxer(0,checkwinnum(i,weights,head2head[i]),weights[i],i+1));
            }else{
                double winrate = ((double)wincount/pan);
                boxerlist.add(new Boxer(winrate,checkwinnum(i,weights,head2head[i]),weights[i],i+1));
            }
            
            //boxerlist.add(new Boxer(wincount,checkwinnum(i,weights,head2head[i]),weights[i],i+1));
        }
        Collections.sort(boxerlist);
        //System.out.println(boxerlist);
        
        for(int i=0; i<weights.length; i++){
            answer[i] = boxerlist.get(i).idx;
        }
        return answer;
    }
    
    public int checkwinnum(int idx, int[] weights, String head2head){
        int nowWeight = weights[idx];
        int cnt =0;
        String [] record = head2head.split("");
        for(int i=0; i<weights.length; i++){
            if(nowWeight<weights[i]){
                if(record[i].equals("W")){
                    cnt++;
                }
            }
        }
        return cnt;
    }
}
profile
하루하루는 성실하게 인생 전체는 되는대로

0개의 댓글