[2021-09-10] 복서 정렬하기

2021. 9. 11. 00:07코딩테스트

푼 시간 : 2시간 30분

언어 : 자바

 


 

https://programmers.co.kr/learn/courses/30/lessons/85002?language=java 

 

코딩테스트 연습 - 6주차

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

programmers.co.kr

 

정렬인데, 단순한 정렬같은 느낌이 아니었다...

완전탐색을 보는듯한 풀이법..

코드를 더 효율적으로 쓰고싶다...ㅜㅜ

주어진 조건대로 풀이를 하고나서 처음에는 테스트케이스가 맞아서 기뻐했는데

제출을 해보니 안맞는것이었다.

 

조건 몇가지를 내 맘대로 생각해서 질질 끌고 있었다.

조건이 세세적으로 주어졌는데도 오래동안 잡고있었더니 너무 힘들다..

 

import java.util.*;

class Solution {
    public int[] solution(int[] weights, String[] head2head) {
        int[] answer = {};
        char[] key = {'L', 'W'};
        // 이기고 진것만 카운트 하기 위해
        double win = 0;
        // 이긴것
        double sum = 0;
        // 총 경기한 수
        double[] late = new double[weights.length];
        // 승률
        int[] heavy = new int[weights.length];
        // 나보다 몸무게 많은사람을 이긴 횟수
        int[] num = new int[weights.length];
        // 나의 번호
        char[] temp;
        // 복서가 이기고 진 경기 내용
        int box = 0;
        // 그냥 더하기 빼기할때 쓰려고
        double latebox = 0;
        // 승률이 더블이라...
        
        for(int i=0; i<weights.length; i++){
            num[i]=i+1;
        }
        
        for(int i=0; i<weights.length; i++) {
            sum=0;
            win=0;
            temp = head2head[i].toCharArray();
            // 경기결과를 저장했다.
            for(int j=0; j<weights.length; j++) {
                if(temp[j] == key[0])
                // 졌으면 경기수만
                    sum += 1;
                else if(temp[j] == key[1]){
                // 이겼으면 경기수, 이긴 수
                    win += 1;
                    sum += 1;
                    if(weights[i]<weights[j])
                    // 나보다 무거운사람을 이긴 경우 +1
                        heavy[i] += 1;
                }
            }
            late[i] = win / sum;
            // 승률
            if(Double.isNaN(late[i])){
            // 승률이 0일경우 nan이 되기때문에, 0을 직접 넣어줘야 한다.
                late[i]=0;
            }
        }
        
        // 이제부터 그냥 하드코딩... 진짜 멋대가리 없다.
        
        for(int i=0; i<weights.length; i++) {
            for(int j=0; j<weights.length-1; j++){
                if(late[j] < late[j+1]){
                // 승률이 나보다 높으면 뒤로 도망 ㅠㅠ
                    latebox = late[j];
                    late[j] = late[j+1];
                    late[j+1] = latebox;
                    box = num[j];
                    num[j] = num[j+1];
                    num[j+1] = box;
                    box = weights[j];
                    weights[j] = weights[j+1];
                    weights[j+1] = box;
                    box = heavy[j];
                    heavy[j] = heavy[j+1];
                    heavy[j+1] = box;
                }
            }
        }
        
        for(int i=0; i<weights.length; i++){
            for(int j=0; j<weights.length-1; j++){
                if(heavy[j] < heavy[j+1] && late[j] == late[j+1]){
                // 승률은 같은데 무거운사람을 많이 때려눕힌경우 도망 ㅠㅠ
                    latebox = late[j];
                    late[j] = late[j+1];
                    late[j+1] = latebox;
                    box = num[j];
                    num[j] = num[j+1];
                    num[j+1] = box;
                    box = weights[j];
                    weights[j] = weights[j+1];
                    weights[j+1] = box;
                    box = heavy[j];
                    heavy[j] = heavy[j+1];
                    heavy[j+1] = box;
                }
            }
        }
        
        for(int i=0; i<weights.length; i++){
            for(int j=0; j<weights.length-1; j++){
                if(weights[j] < weights[j+1] && late[j] == late[j+1] && heavy[j] == heavy[j+1]){
                // 둘다 같은데 나보다 체중이 높은경우 ㅠㅠ
                    latebox = late[j];
                    late[j] = late[j+1];
                    late[j+1] = latebox;
                    box = num[j];
                    num[j] = num[j+1];
                    num[j+1] = box;
                    box = weights[j];
                    weights[j] = weights[j+1];
                    weights[j+1] = box;
                    box = heavy[j];
                    heavy[j] = heavy[j+1];
                    heavy[j+1] = box;
                }
            }
        }
        
        for(int i=0; i<weights.length; i++){
            for(int j=0; j<weights.length-1; j++){
                if(num[j] > num[j+1] && weights[j] == weights[j+1] && late[j] == late[j+1] && heavy[j] == heavy[j+1]){
                // 셋다 같은데 나보다 번호가 작은경우 ㅠㅠ
                    latebox = late[j];
                    late[j] = late[j+1];
                    late[j+1] = latebox;
                    box = num[j];
                    num[j] = num[j+1];
                    num[j+1] = box;
                    box = weights[j];
                    weights[j] = weights[j+1];
                    weights[j+1] = box;
                    box = heavy[j];
                    heavy[j] = heavy[j+1];
                    heavy[j+1] = box;
                }
            }
        }
        
        return answer = Arrays.copyOf(num, num.length);
        // 구했으면 복사해주자.
    }
}

 

다른사람의 코드를 보니 놀랍다...

나는 얼마나 하드코딩을 때려박는 사람인가...

다시 한번 나를 돌아보는 시간이었다.

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

알고리즘 문제해결 전략  (0) 2023.12.18
[2022-03-24] 유기농 배추  (0) 2022.03.24
[2021-07-25] 기능개발 (lv2)  (0) 2021.07.25
[2021-07-13] 예산  (0) 2021.07.13
[2021-07-12] 숫자 문자열과 영단어  (0) 2021.07.12