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;
    }
}