알고리즘/C#

[C#] 문자열 내 마음대로 정렬하기 - 프로그래머스

야아옹 2020. 10. 11. 14:23

문제 : 문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하여라!

 

제한조건

  • strings는 길이 1 이상, 50이하인 배열입니다.
  • strings의 원소는 소문자 알파벳으로 이루어져 있습니다.
  • strings의 원소는 길이 1 이상, 100이하인 문자열입니다.
  • 모든 strings의 원소의 길이는 n보다 큽니다.
  • 인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.

 

풀이 : 무리 없이 풀긴했는데.... 다른사람 풀이랑 비슷하지만 속도가 남다른 코딩을 찾아서 다시 공부 해야할것같다.

        그래도 이번에 Thenby 라는 함수를 알게 되었다!

 
 static string[] strings = { "abce", "abcd", "cdx" };
 static int n = 2;
 
 public static string[] solution(string[] strings, int n)
 {
    string[] answer = new string[] { };
    Dictionary<string, string> dic = new Dictionary<string, string>();
    
     for (int i = 0; i < strings.Length; i++)
       dic.Add(strings[i], strings[i][n].ToString());

    answer = dic.OrderBy(x => x.Value).ThenBy(y => y.Key).Select(x => x.Key).ToArray();         
    return answer;
 }                     

 

풀이 : Array.Sort 사용 시 들어가는 인자를 string 배열과, Icompare 클래스 로 진행

        에서 Icomparer<T> 를 상속받는 Class 를 만들고 Compare 및 정렬를 한번에 하는 코딩

 

static string[] strings = { "abce", "abcd", "cdx" };
static int n = 2;
 
public static string[] solution(string[] strings, int n)
{
    Array.Sort(strings, new MyComparer(n));
    return strings;        
 }
 public class MyComparer : IComparer<string>
{
    public int index;
    public MyComparer(int argument)
    {
        index = argument;
    }

    public int Compare(string x, string y)
    {
        int retval = x[index].CompareTo(y[index]);

        if (retval != 0)
        {
            return retval;
        }
        else
        {
            return x.CompareTo(y);
        }
    }
}