본문 바로가기
개발/Unity 내일배움캠프 TIL

C# Sort() 메서드 다루기

by 석시 2023. 8. 23.



연습 문제를 풀다가 상당히 특이한 문제를 발견했다.

문자열 내 마음대로 정렬하기

https://school.programmers.co.kr/learn/courses/30/lessons/12915

문제 설명

문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.

Sort 기준을 내 마음대로 바꾸라는 의도의 문제인데, 어떻게 바꾸는 지를 몰라 헤맸었다.

Sort() 메서드의 비교자 매개변수

ArrayListSort() 메서드가 있다.

이 때 매개변수나 인스턴스 호출로 어떤 것을 정리할 지 넘겨줄 수 있지만, 한 가지를 더 넘겨줄 수 있다.

바로 비교자라는 인터페이스 형태의 함수이다.

이거는 공식문서가 길지 않으니 간단하게 읽고 참고하자.

IComparer<T> 인터페이스 (System.Collections.Generic)
형식에서 두 개체를 비교하기 위해 구현하는 메서드를 정의합니다.
https://learn.microsoft.com/ko-kr/dotnet/api/system.collections.generic.icomparer-1?view=net-7.0

매개 변수로 비교자를 넣어주지 않았을 때는 자료형마다 설정된 기본 비교자로 정렬을 수행한다.

기본 비교자가 없으면요?

ArgumentNullException을 발생시킨다.

Class를 직접 구현할 때는 이러한 비교자를 직접 만들어서 넣어줘야 한다는 뜻이다.

심지어 이러한 비교자를 잘못 만들게 되면 ArgumentException을 발생시키기 때문에 주의해야한다.

해당 인터페이스 형태의 함수만 넣어주면 되니깐… 다른 함수를 넣을 수도 있다.

대리자, 람다를 이용한 Sort() 기능 변경

어찌되었든, 콜백 함수만 넣어주면 된다는 것이다.

여기서 위의 언급한 문제에 대한 나의 코드를 보자.

using System;

public class Solution {
    public string[] solution(string[] strings, int n)
    {
        Array.Sort(strings, (a, b) => {
            if (a[n] < b[n]) return -1;
            else if (a[n] > b[n]) return 1;
            else
                if (String.Compare(a, b) < 0) return -1;
                else if (String.Compare(a, b) > 0) return 1;
                else return 0;
        });

        return strings;
    }
}

Sort() 메서드에 두번째 인자로 람다를 넣어준 것을 볼 수 있다.

정렬하려는 Array나 List의 개별 원소 두 개를 인자로 받아서 첫번째 원소를 앞에 오게 할거면 -1을 리턴하고, 두번째 원소를 앞에 오게 할거면 1을 리턴하는 함수를 작성하면 되는 것이다.

자기 자신하고 비교한다면 0을 반환해야 한다.

대리자도 똑같다. 결국 1이나 -1을 리턴하는 함수를 작성해서 매개변수로 넘겨주면 끝.


Uploaded by N2T

'개발 > Unity 내일배움캠프 TIL' 카테고리의 다른 글

C# LINQ 간단 정리  (0) 2023.08.25
C# 값 vs 참조 형식 (Value vs Reference)  (0) 2023.08.24
C# DataTable 간단 사용법  (0) 2023.08.22
C# 연산자 오버로딩과 인덱서(Indexer)  (0) 2023.08.21
코드 컨벤션  (0) 2023.08.18