@Override
되는 comparator 함수나는 answer[]
로 받아오는 parameter
값들을 모두 또다른 2차원 배열 words
에서 구분하여 선언하였다. 우선 words[i][0]
에서는 다른 단어들과 비교할 대상인 각 단어별 2번째 인덱스 값을, words[i][1]
에서는 동일 단어일때 사전순으로 비교하기 위한 전체 단어를 넣었다.
2차원 배열 words
를 배열하는 과정에서 1) 2번 인덱스의 값비교, 2) 1)이 동일한 경우 단어자체로 사전 순 비교 과정이 필요하다. 그리고 이 모두를 하나로 정리하기 위해 @Override
메서드를 이용해 Arrays.sort()
함수를 구현했다.
문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.
import java.io.*;
import java.util.*;
class Solution {
public String[] solution(String[] strings, int n) {
String[] answer = strings;
int len = answer.length;
String[][] words = new String[len][len];
//answer배열에서 n번째 인덱스들만 2차원배열[0] + 나머지단어 2차원배열[1]
for(int i=0; i<len; i++){
char[] cha = answer[i].toCharArray(); //단어를 배열로
words[i][0] = Character.toString(cha[n]);
words[i][1] = answer[i];
}
Arrays.sort(words, new Comparator<String[]>(){
@Override
public int compare(String[] o1, String[] o2){
if(o1[0].toString().contentEquals(o2[0].toString())){ //0번 인덱스가 동일한 경우 -> 1번인덱스끼리 비교
return o1[1].toString().compareTo(o2[1].toString());
}else{ // 아닌 경우 0번인덱스끼리 비교
return o1[0].toString().compareTo(o2[0].toString());
}
}
});
//words에 맞춰 answer재배열
for(int i=0; i<len; i++){
answer[i] = words[i][1];
}
return answer;
}
}
// n: 몇번째 인덱스
// 2차원배열로 만들어서 1번 인덱스는 n번째 인덱스 애들만 넣음
// 2번 인덱스는 word전체
import java.util.*;
class Solution {
public String[] solution(String[] strings, int n) {
String[] answer = {};
ArrayList<String> arr = new ArrayList<>();
for (int i = 0; i < strings.length; i++) {
arr.add("" + strings[i].charAt(n) + strings[i]);
}
Collections.sort(arr);
answer = new String[arr.size()];
for (int i = 0; i < arr.size(); i++) {
answer[i] = arr.get(i).substring(1, arr.get(i).length());
}
return answer;
}
}
다른 사람들을 보니 '어차피 인덱스로 비교후 사전순 비교' 이므로 인덱스를 맨 앞에 두고 나머지 단어를 뒤에 연달아 list 로 구현했다. 알파벳의 사전순 비교를 고려해서 알고리즘을 구현하면 이렇게도 되는 것을 알 수 있다. 잘 기억해둬야겠다.