본문 바로가기

[TIL][내일배움캠프]

[내일배움캠프][TIL] 23.12.19 (화) - 문자열 내 마음대로 정렬하기

1. 코드카타

 

오늘 푼 알고리즘 문제는 '문자열 내 마음대로 정렬하기' 이다.

 

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

 

이번 문제는 문제 길이만 봤을 때에는 꽤나 단순해보이지만, 막상 문제를 풀어보면 뭔가, 뭔가한다.

왜냐하면 그냥 오름차순 정렬이 아니라 특정 인덱스를 기준으로 오름차순을 해야하기 때문.

 

예를 들어 첫 번째 strings인 ["sun", "bed", "car"] 같은 경우 n이 1이므로 인덱스 1의 값인 "u", "e", "a"를 기준으로 오름차순 정렬을 하여 결과적으로 ["car", "bed", "sun"]을 return해야 한다.

 

 

우선은 정렬을 해야하기 때문에 sorted()를 써야하고(이 경우에는 딱히 값을 가지고 어디 써먹어야하는 일은 없기 때문에 sorted()를 써도 무방), 여기에 조건식을 붙여서 오름차순을 해야하기 때문에 다음의 함수를 사용한다.

 

sortedWith() : 컬렉션의 요소를 사용자 정의 기준에 따라 정렬하는 데 사용하는 함수. 비교자(Comparator)를 인자로 받음.

 

이를 통해서 내가 괄호 안에 특정한 조건식을 집어넣고 그에 맞춰서 정렬할 수 있게 된다.

 

그럼 이제 괄호 안에 어떤 걸 집어넣으면 될까?

당연히 비교자(Comparator)를 넣어야지.

 

그 비교자를 만드는 함수는 다음과 같다.

 

compareBy() : 지정된 기준에 따라 비교자(Comparator)를 생성하는 함수

 

그리고 그 기준은 위에서 n번째 인덱스를 기준으로 잡았기 때문에 compareBy()에 있는 괄호 안에 들어갈 구문은 다음과 같다.

 

{ it[n] }, { it }

 

이는 strings에 있는 각 단어들의 n번째 인덱스를 가져와서 그것들끼리 비교를 하고, 만약 알파벳이 동일하면 그 단어 자체를 기준으로 잡는다는 뜻이다.

 

 

위에 나온 내용들을 조합하면 다음과 같은 코드가 나오게 된다.

 

class Solution {
    fun solution(strings: Array<String>, n: Int): Array<String> {
        return strings.sortedWith(compareBy({ it[n] }, { it })).toTypedArray()
    }
}

 

적다보니 꽤 간결하게 코드가 나왔는데 만약 이걸 모르는 상태였으면 적는 데에 꽤나 애로사항이 생겼을 것 같다.