문제 설명

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

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

1차 코드

import java.util.Arrays;

class Solution {
    public String[] solution(String[] strings, int n) {
        Arrays.sort(strings, n, n+1);

        return strings;
    }
}

 

처음에는 Arrays.sort() 메서드가 각 배열 원소에 대해 특정 위치 인덱스를 기준으로 비교해서 정렬해주는 메서드인 줄 알고 위와 같이 코드를 작성했다.

하지만 결과값이 아래처럼 변화없이 출력되길래 찾아보니, 배열 자체의 인덱스를 설정하는 파라미터였다.

내 코드는 결국 n번째 원소 하나를 정렬하려고 시도하니까 아무 의미 없이 그대로 결과값이 반환되는 것이었다.

 


개선된 코드

특정 기준에 맞게 정렬하기 위해 Comparator 객체를 사용하게 되었다.

import java.util.Arrays;

class Solution {
    public String[] solution(String[] strings, int n) {
        Arrays.sort(strings, (s1, s2) -> {
            if(s1.charAt(n) == s2.charAt(n)){
                return s1.compareTo(s2);
            }else{ 
                return Character.compare(s1.charAt(n), s2.charAt(n));
            }
        });

        return strings;
    }
}

 

Arrays.sort 안에 파라미터로 Comparator를 람다식으로 표현했다.

Comparator는 두 인자를 전달받는데, 내부적으로 정렬을 사용해서 임의의 두 값을 비교하기 때문에 따로 인덱스를 지정해주지 않아도 최적의 원소들만 자동으로 비교해준다.

 

조건문을 보면 특정 위치의 문자가 동일한 경우, 해당 문자열 자체를 사전순으로 비교한다.

compareTo는 String 클래스가 인터페이스에 정의된 메서드를 구현한 것으로, 두 문자열을 사전 순으로 비교해준다.

 

만약 두 문자열의 해당 위치 문자가 다르다면, Character 클래스의 compare 메서드로 두 값을 비교한다.

두 문자를 마이너스 연산을 통해 쉽게 비교할 수도 있지만, 아스키 코드의 범위를 넘어가는 경우에는 스택 오버 플로우가 발생할 수 있어서 Character 클래스의 compare()를 사용하는 게 안정적으로 두 문자를 비교하는 방법이다.

 


 

성능 요약

메모리: 86 MB, 시간: 1.15 ms