안녕하세요. 오늘은 프로그래머스의 파일명 정렬 문제를 풀어보겠습니다. 이 문제는 2018년 KAKAO BLIND RECRUITMENT에서 출제되었습니다.
https://programmers.co.kr/learn/courses/30/lessons/17686
먼저 files배열에 주어진 string을 head, number, tail로 나누어줍니다. 숫자를 기준으로 잡고, 숫자 앞쪽에 있는 String은 head, 숫자들은 number, 숫자 이후에 나오는 String은 tail로 구분해서 나누어줍니다.
Arrays.sort와 comparator를 이용해 files배열을 정렬해줍니다. 우선 file1과 file2의 head부분을 비교해주고, head부분이 같다면 number부분까지 비교해줍니다.
import java.util.*;
class Solution {
public String[] solution(String[] files) {
Arrays.sort(files, (s1, s2) -> {
FileName file1 = detach(s1);
FileName file2 = detach(s2);
int headValue = file1.getHead().toLowerCase().compareTo(file2.getHead().toLowerCase());
if (headValue == 0) {
int num1 = Integer.parseInt(file1.getNumber());
int num2 = Integer.parseInt(file2.getNumber());
return num1 - num2;
} else {
return headValue;
}
});
return files;
}
private FileName detach(String str) {
StringBuilder sb = new StringBuilder();
FileName file = new FileName();
int idx = 0;
int size = str.length();
for (; idx < size; idx++) {
char ch = str.charAt(idx);
if (ch >= '0' && ch <= '9') {
break;
}
sb.append(ch);
}
file.setHead(sb.toString());
sb.delete(0, sb.length());
for (; idx < size; idx++) {
char ch = str.charAt(idx);
if (!(ch >= '0' && ch <= '9')) {
break;
}
sb.append(ch);
}
file.setNumber(sb.toString());
sb.delete(0, sb.length());
for (; idx < size; idx++) {
char ch = str.charAt(idx);
sb.append(ch);
}
file.setTail(sb.toString());
return file;
}
}
class FileName {
private String head = "";
private String number = "";
private String tail = "";
FileName() {
}
public String getHead() {
return head;
}
public void setHead(String head) {
this.head = head;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getTail() {
return tail;
}
public void setTail(String tail) {
this.tail = tail;
}
}
인터넷에서 다른분들이 comparator를 사용해서 푸신 것을 보고 무릎을 탁 쳤다. comparator를 사용할 생각을 아예 못했었다. (사용할 생각을 했다고 하더라도, 저만큼 잘 사용은 못했을 것 같다...) 알고리즘 문제 풀 때 comparator를 사용하는 풀이가 꽤 많이 나오는데, 이참에 더 능숙하게 사용하도록 노력해야겠다.
detach 함수에서 여러 개의 for문에 하나의 index를 돌려서 사용하는 점이 매우 인상깊었다. 여태까지 for문 하나마다 index를 새로 선언해서 사용했었는데, 저런 방법은 처음이라 신기했다.
항상 내 코드에는 맥락이 없어서 코드를 짠 나조차도 이해하기가 어려운데, 참고한 코드는 깔끔하고 이해하기가 쉽다.
객체를 따로 생성하고, 이용하는 방법은 잘 생각한 듯 하다. 알고리즘 문제를 풀 때 객체지향적으로 풀 수 있도록 더 노력해봐야겠다.