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()
}
}
적다보니 꽤 간결하게 코드가 나왔는데 만약 이걸 모르는 상태였으면 적는 데에 꽤나 애로사항이 생겼을 것 같다.