Apple is Apple
article thumbnail

1. 문제 설명

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

제한 조건

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

2. 입출력 예

strings n return
["sun", "bed", "car"]  1  ["car", "bed", "sun"]
["abce", "abcd", "cdx"] 2   ["abcd", "abce", "cdx"]

 

3. 코드

<kotlin />
class Solution { fun solution(strings: Array<String>, n: Int) = strings.sortedWith(compareBy<String>{it[n]}.thenBy{it}) }

4. 풀이

제한조건을 보고 kotlin collection operations를 잘 활용하면 굉장히 간결하게 풀이할 수 있는 문제이다.

 

문제는 String배열의 오름차순 정렬과 각 단어의 인덱스의 정렬, 두 가지 정렬을 동시에 원하고 있다.

 

정렬을 할때 여러 키워드를 사용해서 정렬할 수 있는 sortedWith라는 operation이 있다.

 

sortedWith는 comparator라는 비교할 수 있는 객체를 인자로 받아 정렬을 수행한다. 코틀린에서는 compareBy라는 함수로 쉽게 comparator를 구현할 수 있다. 

 

그래서 먼저 제한 조건대로 각 단어별 인덱스 번호로 오름차순 정렬을 하였다. 그러고 나서 한번 더 정렬을 해야 하는데 이때, 먼저 정렬을 시행했던 상태를 유지하면서 새로운 기준으로 정렬을 해야 한다. 이때 사용할 수 있는 함수가 thenBy이다.

 

만약,

<kotlin />
strings.sorted{it[n]}.sorted{it}

위 처럼 인덱스로 먼저 정렬하고 문자로 정렬하면, 나중에 불린 sorted가 기준이 되어 인덱스별 정렬이 해제된다. 이러한 현상을 방지하기 위해 (이전 정렬 정보 유지) thenBy함수를 쓴다.

 

 

5. 결과

안정적으로 통과한 것을 볼 수 있다.

profile

Apple is Apple

@mjjjjjj