제이슨의 개발이야기

프로그래머스 복서 정렬하기 위클리 챌린지 6주차 본문

코딩테스트

프로그래머스 복서 정렬하기 위클리 챌린지 6주차

제이쓰은 2021. 9. 6. 15:42
728x90
반응형

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

 

코딩테스트 연습 - 6주차

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

programmers.co.kr

안녕하세요! 오늘은 프로그래머스 6주차  복사 정렬하기 문제를 풀어봤습니다! 

 

요번 위클리 챌린지 문제 역시 저번 문제 와 같은 1단계 문제였습니다! 

 

문제 설명

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

  1. 전체 승률이 높은 복서의 번호가 앞쪽으로 갑니다. 아직 다른 복서랑 붙어본 적이 없는 복서의 승률은 0%로 취급합니다.
  2. 승률이 동일한 복서의 번호들 중에서는 자신보다 몸무게가 무거운 복서를 이긴 횟수가 많은 복서의 번호가 앞쪽으로 갑니다.
  3. 자신보다 무거운 복서를 이긴 횟수까지 동일한 복서의 번호들 중에서는 자기 몸무게가 무거운 복서의 번호가 앞쪽으로 갑니다.
  4. 자기 몸무게까지 동일한 복서의 번호들 중에서는 작은 번호가 앞쪽으로 갑니다.

제한사항

  • weights의 길이는 2 이상 1,000 이하입니다.
    • weights의 모든 값은 45 이상 150 이하의 정수입니다.
    • weights[i] 는 i+1번 복서의 몸무게(kg)를 의미합니다.
  • head2head의 길이는 weights의 길이와 같습니다.
    • head2head의 모든 문자열은 길이가 weights의 길이와 동일하며, 'N', 'W', 'L'로 이루어진 문자열입니다.
    • head2head[i] 는 i+1번 복서의 전적을 의미하며, head2head[i][j]는 i+1번 복서와 j+1번 복서의 매치 결과를 의미합니다.
      • 'N' (None)은 두 복서가 아직 붙어본 적이 없음을 의미합니다.
      • 'W' (Win)는 i+1번 복서가 j+1번 복서를 이겼음을 의미합니다.
      • 'L' (Lose)는 i+1번 복사가 j+1번 복서에게 졌음을 의미합니다.
    • 임의의 i에 대해서 head2head[i][i] 는 항상 'N'입니다. 자기 자신과 싸울 수는 없기 때문입니다.
    • 임의의 i, j에 대해서 head2head[i][j] = 'W' 이면, head2head[j][i] = 'L'입니다.
    • 임의의 i, j에 대해서 head2head[i][j] = 'L' 이면, head2head[j][i] = 'W'입니다.
    • 임의의 i, j에 대해서 head2head[i][j] = 'N' 이면, head2head[j][i] = 'N'입니다.

입출력 예

 

weights head2head result
[50,82,75,120] ["NLWL","WNLL","LWNW","WWLN"] [3,4,1,2]
[145,92,86] ["NLW","WNL","LWN"] [2,3,1]
[60,70,60] ["NNN","NNN","NNN"] [2,1,3]

 

이 문제는 꼼꼼하게 문제를 접근해서 풀면 풀 수 있는 문제 인거같습니다! 


이 문제를 풀기 위해 고려 사항 

 

1. 이긴 횟수로 단순 비교 하는 것이 아닌 승률을 구해서 비교해야한다

 

2. 각각의 사람들의 싸운 횟수가 다를 수 있다 즉 승률 구할 때 나누는 divisor 는 싸운횟수이어야 한다

 

3. 승률은 Int 형 이아닌 Double 형 이나 Float 형이어야 한다


저는 위에 고려사항을 생각하고 문제를 풀었습니다

 

처음에 반복문을 통해서 승률 과 자신보다 무개가 많이 나가는 상대를 이긴 횟수를 카운팅 하고 나서 

 

그 다음 반복문을 통해서 정렬합니다

 

이때 정렬하는 방식이 이 문제에서 제일 어려운 부분인거 같습니다! 

 

저 같은 경우 첫번째 배열 원소 부터 다른 배열 원소들이랑 비교 해가는대 

자신 보다 승률이 높거나 등등인 경우

자신의 위치를 가리키는 인덱스 변수의 값을 1씩 증가 시켰습니다 !!

그리고 나서 반복문이 끝나면 마지막으로 자신이 가리키고 있는 인덱스 에 순서를 집어넣었습니다!!

 

class Solution {
    fun solution(weights: IntArray, head2head: Array<String>): IntArray {
        var answer = IntArray(weights.size)
        var winWeight = IntArray(weights.size)
        var winCount = FloatArray(weights.size)

        for(i in weights.indices){
            winWeight[i]=0
            winCount[i]= 0.0F
            var fightingCount = 0

            var str = head2head[i]
            for(j in str.indices){
                if((str[j] == 'N').not()){
                    fightingCount++
                    if(str[j].equals('W')){
                        winCount[i]++
                        if(weights[j]>weights[i]){
                            winWeight[i]++
                        }
                    }
                }
            }
            if(fightingCount!=0){
                winCount[i]= winCount[i]/fightingCount
            }else {
                winCount[i]=0.0F
            }




        }
        for(i in weights.indices){
            var index = 0

            for(j in weights.indices){
                if(winCount[i]<winCount[j]){
                    index++
                }else if(winCount[i]==winCount[j]){
                    if(winWeight[i]<winWeight[j]){
                        index++
                    }else if(winWeight[i]==winWeight[j]){
                        if(weights[i]<weights[j]){
                            index++
                        }
                        if(weights[i]==weights[j]){
                            if(i>j){
                                index++
                            }
                        }
                    }
                }
            }
            answer[index]=i+1
        }
        return answer
    }
}
728x90
반응형