문자열로 구성된 리스트 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
'자료구조 & 알고리즘' 카테고리의 다른 글
[programmers][Java] 숫자와 숫자 영단어가 섞인 문자열을 정수로 변환하기 (0) | 2025.04.16 |
---|---|
[programmers][Java] 시저 암호 (1) | 2025.04.15 |
[백준][Java] 브루트포스 (1) | 2025.04.02 |
[백준][Java] 주어진 단어에서 가장 많이 사용된 알파벳 출력 (0) | 2025.03.27 |
[프로그래머스][Java] 자연수 뒤집어 배열 만들기 (0) | 2025.03.17 |