문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.
strings는 길이 1 이상, 50이하인 배열입니다.
strings의 원소는 소문자 알파벳으로 이루어져 있습니다.
strings의 원소는 길이 1 이상, 100이하인 문자열입니다.
모든 strings의 원소의 길이는 n보다 큽니다.
인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.
strings | n | return |
---|---|---|
["sun", "bed", "car"] | 1 | ["car", "bed", "sun"] |
["abce", "abcd", "cdx"] | 2 | ["abcd", "abce", "cdx"] |
입출력 예 1
"sun", "bed", "car"의 1번째 인덱스 값은 각각 "u", "e", "a" 입니다. 이를 기준으로 strings를 정렬하면 ["car", "bed", "sun"] 입니다.
입출력 예 2
"abce"와 "abcd", "cdx"의 2번째 인덱스 값은 "c", "c", "x"입니다. 따라서 정렬 후에는 "cdx"가 가장 뒤에 위치합니다. "abce"와 "abcd"는 사전순으로 정렬하면 "abcd"가 우선하므로, 답은 ["abcd", "abce", "cdx"] 입니다.
이 문제는 문자열 안에서 특정 인덱스의 character
를 기준으로 문자열을 정렬하는 문제입니다.
단, 해당 인덱스의 character
가 같을 경우 정렬 기준은 사전순서를 기준으로 합니다.
처음에는 이중 for문
을 사용하여 앞 문자열의 n
번째 character
와 뒷 문자열의 n
번째 character
를 비교하여 strings
배열 안에서만 두 문자열을 치환하는 방향으로 풀었습니다.
하지만 왜인지 정렬이 잘 되지 않았고, 문제가 잘 풀리지 않았습니다..
그래서 저는 또 다른 방법이 없을까 탐색하다가 이러한 알고리즘을 통해 답을 구하게 되었습니다.
answer
을 선언합니다. 단, 길이는 strings
와 동일하게 합니다.strings
의 문자열을 다 저장해야 하기 때문입니다.
answer
의 인덱스를 저장할 변수인 idx
를 선언하여 0
으로 초기화합니다.for문
의 i
j
와는 별개로 떨어뜨려놓음으로써 제가 원할 때만 증가시킬 수 있게 됩니다.
Arrays.sort()
를 사용하여 미리 사전순으로 오름차순 정렬을 합니다.이는 두 문자열의 n
번째 character
가 동일할 경우를 대비하는 것입니다. 만약 기준이 되는 character
가 동일하더라도 이미 사전순으로 정렬이 되어있기 때문에 따로 정렬이 필요없어지게 됩니다.
a~z
까지 i
를 반복하고, strings
의 문자열의 n
번째 character
를 비교하여 같다면 answer[idx]
에 n
번째 character
가 같은 문자열인 strings[j]
를 저장하여 정렬이 된 배열을 리턴할 수 있도록 합니다.idx++
을 통해 answer[idx]
에 저장한 뒤 idx
값이 증가되어 다음 문자열은 다음 answer
의 방에 집어넣을 수 있게 됩니다.import java.util.Arrays;
class Solution {
public String[] solution(String[] strings, int n) {
String[] answer = new String[strings.length];
int idx = 0;
Arrays.sort(strings);
for ( int i = 'a'; i < 'z'; i++) {
for ( int j = 0; j < strings.length; j++) {
if ( (char)i == strings[j].charAt(n) )
answer[idx++] = strings[j];
}
}
return answer;
}
}