[Java] 프로그래머스(level-2) - 파일명 정렬
문제 풀이
이번 문제는 주어진 배열을 조건별로 정렬하여 풀 수 있는 문제이다.
아이디어 도출
문제에서 요구하는 정렬 기준에 따라서 정렬을 해야한다.
필자는 Java를 이용해 풀기 때문에 Comparator
의 compare()
메서드를 재정의하여 커스텀 정렬을 구현하였다.
문제 풀이를 위한 아이디어는 다음과 같다.
- files 배열을 정렬하는 데, 파일명 별로 HEAD, NUMBER, TAIL를 분리한다.
- HEAD의 경우 대소문자 구분을 하지 않기에 대문자든, 소문자든 통일시킨다.
- HEAD와 NUMBER가 모두 같다면, HEAD를 기준으로 사전 순 정렬하여 입력 순서를 보장하도록 한다.
- 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);
}
}
회고
- —
출처
- —
- 해당 문제의 저작권은 문제를 만든이에게 있으며 자세한 내용은 문제 링크에서 참조바랍니다.