2 minute read



문제 풀이


이번 문제는 주어진 배열을 조건별로 정렬하여 풀 수 있는 문제이다.


아이디어 도출

문제에서 요구하는 정렬 기준에 따라서 정렬을 해야한다. 필자는 Java를 이용해 풀기 때문에 Comparatorcompare() 메서드를 재정의하여 커스텀 정렬을 구현하였다.

문제 풀이를 위한 아이디어는 다음과 같다.

  1. files 배열을 정렬하는 데, 파일명 별로 HEAD, NUMBER, TAIL를 분리한다.
  2. HEAD의 경우 대소문자 구분을 하지 않기에 대문자든, 소문자든 통일시킨다.
  3. HEAD와 NUMBER가 모두 같다면, HEAD를 기준으로 사전 순 정렬하여 입력 순서를 보장하도록 한다.
  4. HEAD만 같다면, NUMBER를 int형으로 비교하여 오름차순으로 정렬한다.


다음으로 문제 풀이를 위해 작성한 코드는 아래와 같다.



작성 코드


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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import java.util.*;

class Solution {


    public String[] solution(String[] files) {

        // 1. HEAD: 사전 순 정렬, 대소문자 구분 X
        // 2. NUMBER: 숫자 순 정렬, 숫자 앞 0 무시
        // 3. HEAD와 NUMBER가 같다면 입력 순서 유지

        Arrays.sort(files, (o1, o2) -> {
            
            String[] o1_sep = separate(o1);
            String[] o2_sep = separate(o2);

            /*
             * HEAD를 기준으로 사전 순 정렬을 한다.
             * 두 문자의 head가 같다면 0
             * o1의 head가 크면 양수
             * o2가 크면 음수
             */
            int compareHead = o1_sep[0].compareTo(o2_sep[0]);
            
            /*
             * HEAD가 같다면 NUMBER를 기준으로 오름차순 정렬한다.
             * NUMBER도 같다면 0을 반환하여 입력 순서를 보장한다.
             * 
             * 두 수의 HEAD가 다르다면, HEAD를 기준으로 정렬한다.
             */
            if(compareHead == 0) {
                int o1_num = Integer.parseInt(o1_sep[1]);
                int o2_num = Integer.parseInt(o2_sep[1]);
                return o1_num - o2_num;
            } else {
                return compareHead;
            }
            
        });

        return files;
    }

    public static String[] separate(String str) {

        String head = "";
        String number = "";
        String tail = "";

        // 하나의 인덱스를 통해 head를 먼저 갱신하고 숫자부터 number를 갱신한다. 이후는 tail에 갱신한다.
        int idx = 0;
        
        // 숫자가 나올때까지 head 갱신
        for(; idx<str.length(); idx++) {
            char c = str.charAt(idx);
            if(('0' <= c && c <= '9')) break;
            head += c;
        }

        // 숫자부터 number 갱신
        for(; idx<str.length(); idx++) {
            char c = str.charAt(idx);
            if(!('0' <= c && c <= '9')) break;
            number += c;
        }

        // 나머지 문자열 tail에 갱신
        for(; idx<str.length(); idx++) {
            char c = str.charAt(idx);
            tail += c;
        }

        return new String[]{head.toLowerCase(), number, tail};
    }


    public static void main(String[] args) {
        
        Solution sol = new Solution();
        
        // String[] files = new String[]{"img12.png", 
        //                                 "img10.png", 
        //                                 "img02.png", 
        //                                 "img1.png", 
        //                                 "IMG01.GIF",
        //                                 "img2.JPG"};

        String[] files = new String[]{"F-5 Freedom Fighter", 
                                        "B-50 Superfortress", 
                                        "A-10 Thunderbolt II", 
                                        "F-14 Tomcat"};

        sol.solution(files);

    }

}

회고

- —


출처

- —

  • 해당 문제의 저작권은 문제를 만든이에게 있으며 자세한 내용은 문제 링크에서 참조바랍니다.