파일명 정렬

이준경·2021년 6월 5일
0

<나의풀이>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import java.util.*;
class Solution {
    public String[] solution(String[] files) {
        String[] answer = {};
 
        Arrays.sort(files,new Comparator<String>(){
            @Override
            public int compare(String s1, String s2){
                String head1 = s1.split("[0-9]")[0];
                String head2 = s2.split("[0-9]")[0];
 
                head1=head1.toUpperCase();
                head2=head2.toUpperCase();
 
                int headsort = head1.compareTo(head2);
 
                if(headsort==0){
                    String numtail1 = s1.substring(head1.length());
                    String numtail2 = s2.substring(head2.length());
                    StringBuffer num1 = new StringBuffer("");
                    StringBuffer num2 = new StringBuffer("");
 
                    for(char c : numtail1.toCharArray()) { 
                        if(Character.isDigit(c) && num1.length()<=5)
                            num1.append(c);
                        else
                            break;
                    }
 
                    for(char c : numtail2.toCharArray()) { 
                        if(Character.isDigit(c) && num2.length()<=5)
                            num2.append(c);
                        else
                            break;
                    }
 
                    return Integer.parseInt(num1.toString()) - Integer.parseInt(num2.toString());
 
                }else{
                    return headsort;
                }
 
            }
 
 
 
        });
        return files;
    }
}
cs

처음 문제를 접했을 때 compare을 이용하는 문제임을 파악함. 그러나 Array.sort를 잊어버리고 배열을 하나씩 비교하여 정렬 해야 하나 고민에 빠짐. 결국 힌트를 보고 Array.sort가 배열을 모두 비교하고 정렬한다는 것을 기억하고 문제를 품.

참고 사이트

  1. Array.sort에 배열과 Comparator를 상속받은 익명객체를 만들어 정렬함.
  2. Comparator
    -1. 먼저 s1,s2의 head를 split을 통해 각각 구함.
    -2. 각각 대문자로 만든후 head1의 comparTo를 이용한 기본 정렬의 값을 headsort에 대입
    -3. 여기서 headsort가 0인 경우 number비교를 실시. 아니면 headsort값 리턴.
    -4. numtail1, 2를 각각 substring으로 구하고 num1,2를 각각 StringBuffer로 초기화
    -5. numtail1의 각 문자 요소가 숫자이면서 5글자 아래라면 num1에 문자 요소를 append
    -6. numtail2도 동일하게 실시
    -7. num1, 2를 toString으로 변환 후 각각 Integer 변환하여 비교후 반환
  3. file 정렬 후 반환.

<다른사람풀이>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.util.*;
class Solution {
  public String[] solution(String[] files) {
      Arrays.sort(files, new StrCmp());
      return files;
  }
  private class StrCmp implements Comparator<String> {
      @Override
      public int compare(String s1, String s2) {
          s1 = s1.toLowerCase();
          s2 = s2.toLowerCase();
          int i = 0;
          int j = 0;
          while (i < s1.length() && !Character.isDigit(s1.charAt(i))) ++i;
          while (j < s2.length() && !Character.isDigit(s2.charAt(j))) ++j;
          int cmp1 = s1.substring(0, i).compareTo(s2.substring(0, j));
          if (cmp1 != 0return cmp1;
          int startI = i;
          int startJ = j;
          while (i < s1.length() && Character.isDigit(s1.charAt(i))) ++i;
          while (j < s2.length() && Character.isDigit(s2.charAt(j))) ++j;
          int num1 = Integer.parseInt(s1.substring(startI, i));
          int num2 = Integer.parseInt(s2.substring(startJ, j));
          return num1 - num2;
      }
  }
}
cs

익명 클래스가 아닌 클래스를 만들고 사용함. 원리는 같으나 중간 풀이가 다름.
split이 아닌 while을 이용하여 head를 구하고 number는 for문이 아닌 while을 이용하여 좀더 가독성이 뛰어남.

0개의 댓글

관련 채용 정보