prgms.12915 - 문자열 내 마음대로 정렬하기
자바의 경우 Comparable 인터페이스를 구현하는 클래스를 별도로 정의해서 compareTo를 적절히 오버라이딩하면 원하는 기준으로 Collections를 정렬할 수 있다. 따라서 n번째 문자를 target에 저장하고, String은 word에 저장한뒤 List에 하나씩 추가한다. 그리고 target이 다르다면 그것을 기준으로 정렬하고, 만약 다르다면 String의 compareTo를 사용한다.
class Strings implements Comparable<Strings> {
String word;
char target;
public Strings(String word, char target) {
this.word = word;
this.target = target;
}
public int compareTo(Strings s) {
if (this.target != s.target) {
return this.target - s.target;
} else {
return this.word.compareTo(s.word);
}
}
}
class Solution {
public List<String> solution(String[] strings, int n) {
List<Strings> stringList = new ArrayList<>();
for (String s : strings) {
char target = s.charAt(n);
stringList.add(new Strings(s, target));
}
Collections.sort(stringList);
List<String> answer = new ArrayList<>();
for (Strings s : stringList) {
answer.add(s.word);
}
return answer;
}
}
다른 사람의 풀이1
Arrays.sort()내부에 Comparator익명객체를 구현하였다.
class Solution {
public String[] solution(String[] strings, int n) {
Arrays.sort(strings, new Comparator<String>(){
@Override
public int compare(String s1, String s2){
if(s1.charAt(n) > s2.charAt(n)) return 1;
else if(s1.charAt(n) == s2.charAt(n)) return s1.compareTo(s2);
else if(s1.charAt(n) < s2.charAt(n)) return -1;
else return 0;
}
});
return strings;
}
}
이 부분은 이런식으로 뺄셈을 활용하여 약간 더 개선이 가능한 것 같다.
@Override
public int compare(String s1, String s2){
int compare = s1.charAt(n) - s2.charAt(n);
if(compare == 0) return s1.compareTo(s2);
return compare;
}
@Override
public int compare(String s1, String s2){
return s1.charAt(n) - s2.charAt(n) == 0 ?
s1.compareTo(s2) : s1.charAt(n) - s2.charAt(n);
}
다른 사람의 풀이2
타겟 문자를 맨앞에 접두사처럼 붙여서 String배열을 만든다. 에를 들어, strings가 ["sun", "bed", "car"]이고 n이 1이라면, ["usun", "ebed", "acar"]과 같은 배열이 만들어지는 것이다. 그리고 sort를 하면 접두사를 기준으로 우선 정렬이 되고, 나머지는 사전순으로 정렬이 될 것이다. 마지막으로 접두사를 substring으로 모두 제거해주면 된다.
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;
}
}