728x90
반응형
https://programmers.co.kr/learn/courses/30/lessons/85002
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;
}
}
* 문제 조건
- 전체 승률이 높은 복서의 번호가 앞쪽으로 갑니다. 아직 다른 복서랑 붙어본 적이 없는 복서의 승률은 0%로 취급합니다.
- 승률이 동일한 복서의 번호들 중에서는 자신보다 몸무게가 무거운 복서를 이긴 횟수가 많은 복서의 번호가 앞쪽으로 갑니다.
- 자신보다 무거운 복서를 이긴 횟수까지 동일한 복서의 번호들 중에서는 자기 몸무게가 무거운 복서의 번호가 앞쪽으로 갑니다.
- 자기 몸무게까지 동일한 복서의 번호들 중에서는 작은 번호가 앞쪽으로 갑니다.
-> 필요 정보 [ 승률, 자기보다 무거운 복서를 이긴 횟수, 몸무게 ]
=> 정보 데이터를 만들고 조건에 맞게 순서대로 정렬
* 근데 어차피 4번은 안 해도 상관없긴 하지 않나 싶음 음음..
- 느낀점 -
- 승률이 더럽게 계산되는지 float으로 안됨 double까지 가니까 답이 나옴
- Dictionary를 쓰게 될 줄 몰랐음 Level 1 인디..? (한 Level 2 정도는 되는 느낌이었는뎅..)
- 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(); } }
- 안 본 사이에 새로운 문제가 많아짐
* Enumerable
https://docs.microsoft.com/ko-kr/dotnet/api/system.linq.enumerable?view=net-5.0
반응형
'프로그래머스_C# > Level_1' 카테고리의 다른 글
[프로그래머스 C#] 나머지가 1이 되는 수 찾기 (0) | 2021.10.20 |
---|---|
[프로그래머스 C#] 없는 숫자 더하기 (0) | 2021.10.19 |
[프로그래머스 C#] Level 1 Tips (0) | 2021.09.11 |
[프로그래머스 C#] 로또의 최고 순위와 최저 순위 (0) | 2021.09.10 |
[프로그래머스 C#] 4주차 직업군 추천하기 (0) | 2021.09.10 |