프로그래머스_C#/Level_1

[프로그래머스 C#] 6주차_복서 정렬하기

최애뎡 2021. 10. 18. 23:47
728x90
반응형

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

 

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

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

programmers.co.kr

using System;
using System.Collections.Generic;
using System.Linq;

public class Solution {
    public int[] solution(int[] weights, string[] head2head) {
        int _length = weights.Length;
        int[] answer = new int[_length];
        
        Dictionary<int, double[]> _table = Information(weights, head2head, _length);
        
        answer = SortTableToArray(_table);
        
        return answer;
    }
    
    Dictionary<int, double[]> Information(int[] weights, string[] head2head, int _length)
    {
        Dictionary<int, double[]> temp_dic = new Dictionary<int, double[]>();
                
        for (int i = -1; ++i < _length;)
        {
            double[] temp_double = new double[3];
            double W = 0; int N = 0, WW = 0;
            
            for (int j = -1; ++j < _length;)
            {
                temp_double[2] = weights[i];
                if (head2head[i][j] == 'W') 
                {
                    ++W;
                    if (weights[i] < weights[j]) ++WW;                        
                }
                if (head2head[i][j] == 'N') ++N;
            }                
            
            if (W == 0) W = 0;
            else W = W / (_length - N) * 100;
            temp_double[0] = W; temp_double[1] = WW;
            
            temp_dic.Add(i, temp_double);         
        }
        
        return temp_dic;        
    }    

    int[] SortTableToArray(Dictionary<int, double[]> _table)
    {              
        int[] temp_Array = _table.OrderByDescending(x => x.Value[0]).
            ThenByDescending(x => x.Value[1]).ThenByDescending(x => x.Value[2]).
            Select(x => x.Key + 1).ToArray();
        
        return temp_Array;
    }
}

* 문제 조건

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

-> 필요 정보 [ 승률, 자기보다 무거운 복서를 이긴 횟수, 몸무게 ]

=> 정보 데이터를 만들고 조건에 맞게 순서대로 정렬 

* 근데 어차피 4번은 안 해도 상관없긴 하지 않나 싶음 음음..

 

- 느낀점 -

  1. 승률이 더럽게 계산되는지 float으로 안됨 double까지 가니까 답이 나옴
  2. Dictionary를 쓰게 될 줄 몰랐음 Level 1 인디..? (한 Level 2 정도는 되는 느낌이었는뎅..)
  3. Enumerable 메소드에 대한 뇌를 좀 생각을 좀 해야겠음
    [ 문제가 다중 정렬인데 ThenByDescending, Select를 처음엔 생각을 못함
     => 그래서 처음에 무지성으로 직접 정렬해버림 즉 아래와 같이 나와 버림 ㅋㅋㅋㅋ]
    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    public class Solution {
        public int[] solution(int[] weights, string[] head2head) {
            int _length = weights.Length;
            int[] answer = new int[_length];
    
            Dictionary<int, double[]> _table = Information(weights, head2head, _length);
    
            answer = SortTableToArray(_table);
    
            return answer;
        }
    
        Dictionary<int, double[]> Information(int[] weights, string[] head2head, int _length)
        {
            Dictionary<int, double[]> temp_dic = new Dictionary<int, double[]>();
    
            for (int i = -1; ++i < _length;)
            {
                double[] temp_double = new double[3];
                double W = 0; int N = 0, WW = 0;
    
                for (int j = -1; ++j < _length;)
                {
                    temp_double[2] = weights[i];
                    if (head2head[i][j] == 'W') 
                    {
                        ++W;
                        if (weights[i] < weights[j]) ++WW;                        
                    }
                    if (head2head[i][j] == 'N') ++N;
                }                
    
                if (W == 0) W = 0;
                else W = W / (_length - N) * 100;
                temp_double[0] = W; temp_double[1] = WW;
    
                temp_dic.Add(i, temp_double);         
            }
    
            return temp_dic;        
        }    
    
        List<KeyValuePair<int, int[]>> sortW(Dictionary<int, double[]> _table)
        {
            List<KeyValuePair<int, int[]>> temp = new List<KeyValuePair<int, int[]>>();
            double CurrentRate = _table.Values.ToList()[0][0];
    
            for (int i = -1; ++i < _table.Count;)
            {
                double[] information = _table.Values.ToList()[i].ToArray();
                if (CurrentRate == information[0])
                {
                    int[] temp_int = new int[2];
                    temp_int[0] = (int)information[1]; temp_int[1] = (int)information[2];
                    temp.Add(new KeyValuePair<int, int[]>(_table.Keys.ToList()[i], temp_int));
                }                    
                else break;
            }
    
            return temp;
        }
    
        List<int> SortWW(List<KeyValuePair<int, int[]>> _table)
        {
            _table = _table.OrderByDescending(x => x.Value[0]).ToList();            
            List<int> _temp_list = new List<int>();
    
            while (_table.Count > 0)
            {
                List<KeyValuePair<int, int>> temp = new List<KeyValuePair<int, int>>();
                int CurrentWW = _table[0].Value[0];
                for (int i = -1; ++i < _table.Count;)
                {
                    int[] information = _table[i].Value;
                    if (CurrentWW == information[0])
                    {
                        temp.Add(new KeyValuePair<int, int>(_table[i].Key, information[1]));
                        _table.RemoveAt(i);
                        --i;
                    }                    
                    else break;
                }
                temp = temp.OrderByDescending(x => x.Value).ToList();
    
                foreach(KeyValuePair<int, int> index in temp)
                    _temp_list.Add(index.Key);
            }
    
            return _temp_list;
        }
    
        int[] SortTableToArray(Dictionary<int, double[]> _table)
        {              
            _table = _table.OrderByDescending(x => x.Value[0]).ToDictionary(x => x.Key, x => x.Value);
             List<int> temp_list = new List<int>();
    
            while (_table.Count > 0)
            {            
                List<KeyValuePair<int, int[]>> temp = sortW(_table);
                List<int> temp_WW = SortWW(temp);
    
                foreach(int index in temp_WW)
                {
                    temp_list.Add(index);
                    _table.Remove(index);
                }
            }
    
            for (int i = -1; ++i < temp_list.Count;)
                temp_list[i] += 1;
    
            return temp_list.ToArray();
        }
    }
  4. 안 본 사이에 새로운 문제가 많아짐

* Enumerable

https://docs.microsoft.com/ko-kr/dotnet/api/system.linq.enumerable?view=net-5.0 

 

Enumerable 클래스 (System.Linq)

IEnumerable을 구현하는 개체를 쿼리하기 위한 static(Visual Basic의 경우 Shared) 메서드 집합을 제공합니다.Provides a set of static (Shared in Visual Basic) methods for querying objects that implement IEnumerable.

docs.microsoft.com

반응형