알고리즘/프로그래머스 Level1

[프로그래머스,자바] Level1:위클리 챌린지 6주차 [복서 정렬하기]

류창 2021. 9. 6. 22:12
반응형

문제분석:

복서간의 경기기록이 주어지고, 경기기록에의해 나오는 정보(몸무게, 승률,자신보다 몸무게가큰 선수와의 승리,번호)

를 이용하여 지정정렬하는 문제입니다. 

이게왜 Leve1이지???;

문제풀이

지정정렬하기 위해선 각 복서마다 정보가 4개 (번호,승률,자신보다 몸무게가큰 선수와 승리수,몸무게)가

필요하다. 

 

이걸 효율적으로 사용하기위해, 새로 Boxer클래스를 생성하고 4개의변수를 생성했다.

 

변수를 초기화하고, 생성자를 생성해 생성자주입으로 코딩하였다.

 

10~40줄까지 복서를 순회(1차반복)하면서, 4개의 정보를 저장하기위한 변수를 초기화한다.

 

복서의 승리기록(2차반복)을 순회하면서 승률과 자신보다 무거운복서를 승리한횟수를 저장한다.

 

반복이 모두끝나고 4개의 정보를구했다면, list에 Boxer를 저장한다.

 

40~66줄부터는 list에 저장된 Boxer들을 지정정렬한다. 

 

다른사람의 풀이를보니 이 지정정렬을 엄청 깔끔하게 하신분이 계신다. 

 

필자같은경우는 그냥 모든 경우를 손코딩한건데, 조건문과 리턴을 잘 넣으면 훨씬 줄일수있다. 

 

지정정렬까지 모두완료했다면, List의 Boxer의 번호를 배열에넣어서 반환하면된다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import java.util.*;
class Solution {
    public int[] solution(int[] weights, String[] head2head) {
 
 
        double boxer = head2head.length;
 
        List<Boxer> list = new ArrayList<>();
 
        for(int i=0; i<boxer;i++){
            int boxerNum=i+1;
            double win_rate=0;
            int over_cnt=0;
            int weight=weights[i];
 
            int cnt=0;
            int index=0;
            int not_play=0;
            //승률,무거운복서 이긴횟수
            for(String s:head2head[i].split("")){
                if(s.equals("W")){
                    cnt++;
                    if(weights[i]<weights[index]){
                        over_cnt++;
                    }
                } 
                else if(s.equals("N")){
                    not_play++;
                }
                index++;
 
                if(boxer==not_play){
                    win_rate=0;
                    break;
                }
                win_rate=cnt/(boxer-not_play);
            }
 
            list.add(new Boxer(boxerNum,win_rate,over_cnt,weight));
        }
 
        Collections.sort(list,new Comparator<Boxer>(){
            public int compare(Boxer s1,Boxer s2){
 
                if(s1.win_rate>s2.win_rate){
                    return -1;
                }
                else if(s1.win_rate==s2.win_rate){
                    if(s1.cnt>s2.cnt){
                        return -1;
                    }
                    else if(s1.cnt==s2.cnt){
                        if(s1.weight>s2.weight){
                            return -1;
                        }
                        else if(s1.weight==s2.weight){
                            if(s1.boxerNum>s2.boxerNum){
                                return 1;
                            }
                            else{return -1;}
                        }
                        else{return 1;}
                    }
                    else{return 1;}
                }
                else{return 1;}
 
 
 
 
            }
        });
 
 
        int[] answer = new int[head2head.length];
        for(int i=0;i<list.size();i++){
            answer[i]=list.get(i).boxerNum;
        }
 
        return answer;
    }
 
 
}
 
class Boxer {
    int boxerNum;
    double win_rate;
    int cnt;
    int weight;
 
    public Boxer(int boxerNum,double win_rate, int cnt,int weight){
        this.boxerNum = boxerNum;
        this.win_rate = win_rate;
        this.cnt = cnt;
        this.weight = weight;
    }
}
cs
반응형