프로그래머스 2018 KAKAO BLIND RECRUITMENT Level 2 문제 파일명 정렬을 Java를 이용해 풀어보았다.
Comparator를 이용한 간단한 정렬 문제였다.
문제 링크 첨부한다.
https://programmers.co.kr/learn/courses/30/lessons/17686
파일명 원본이 주어지면 그에 따라 Head, Number, Tail 세 부분으로 나눌 수 있다. 먼저 Head를 대소문자 무관한 사전순으로 정렬하고 -> Number에 따라 오름차순으로 정렬한 순서를 반환하면 된다.
하지만 결국 반환해주는 건 파일명 원본이기 때문에 원래 파일명도 계속 가지고 있어야 한다. 이를 위해 다음과 같은 Info
클래스를 선언했다.
static class Info{
String fileName;
String lowerCaseHead;
int number;
Info(String fileName, String lowerCaseHead, int number){
this.fileName = fileName;
this.lowerCaseHead = lowerCaseHead;
this.number = number;
}
String getLowerCaseHead() { return lowerCaseHead; } // 요 두 getter 메소드는 나중에 Comparator에 이용하기 위함
Integer getNumber() { return number; }
}
그런데 우리가 원하는 건 결국 파일명 하나가 주어졌을 때 그에 따른 Info
객체 하나를 생성하기 원하는 것이다. 따라서 다음과 같은 생성자를 추가해줬다.
Info(String s){
StringBuilder sb = new StringBuilder();
String lowerCaseHead = "";
int number;
int i;
for(i=0; i<s.length(); i++){
if(!Character.isDigit(s.charAt(i))) sb.append(Character.toLowerCase(s.charAt(i)));
else break;
}
lowerCaseHead = sb.toString();
sb = new StringBuilder();
for(i=i; i<s.length(); i++){
if(Character.isDigit(s.charAt(i))) sb.append(s.charAt(i));
else break;
}
number = Integer.parseInt(sb.toString());
this.fileName = s;
this.lowerCaseHead = lowerCaseHead;
this.number = number;
}
이 생성자를 사용하면 주어진 String[] files
에 대해 다음과 같은 작업이 가능하다.
static ArrayList<Info> list = new ArrayList<>();
static String[] solution(String[] files) {
for(String s: files) list.add(new Info(s)); // 그냥 생성자만 이용해서 쉽게 추가 가능함
list.sort(Comparator.comparing(Info::getLowerCaseHead).thenComparing(Info::getNumber));
String[] answer = new String[files.length];
int i = 0;
for(Info info: list){
answer[i] = info.fileName;
i++;
}
return answer;
}
정렬을 Comparator.comparing()
메소드를 이용해 쉽게 할 수 있다. 이 방법은 이전에 올렸던 포스트인 실패율을 풀 때 처음으로 배운 방법이었다.
아래는 내가 제출한 전체 코드다.
import java.io.*;
import java.util.ArrayList;
import java.util.Comparator;
public class FileNameSorting {
static ArrayList<Info> list = new ArrayList<>();
static String[] solution(String[] files) {
for(String s: files) list.add(new Info(s));
list.sort(Comparator.comparing(Info::getLowerCaseHead).thenComparing(Info::getNumber));
String[] answer = new String[files.length];
int i = 0;
for(Info info: list){
answer[i] = info.fileName;
i++;
}
return answer;
}
static class Info{
String fileName;
String lowerCaseHead;
int number;
Info(String s){
StringBuilder sb = new StringBuilder();
String lowerCaseHead = "";
int number;
int i;
for(i=0; i<s.length(); i++){
if(!Character.isDigit(s.charAt(i))) sb.append(Character.toLowerCase(s.charAt(i)));
else break;
}
lowerCaseHead = sb.toString();
sb = new StringBuilder();
for(i=i; i<s.length(); i++){
if(Character.isDigit(s.charAt(i))) sb.append(s.charAt(i));
else break;
}
number = Integer.parseInt(sb.toString());
this.fileName = s;
this.lowerCaseHead = lowerCaseHead;
this.number = number;
}
String getLowerCaseHead() { return lowerCaseHead; }
Integer getNumber() { return number; }
}
public static void main(String[] args) throws IOException {
BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(System.out));
String[] files = {"img12.png", "img10.png", "img02.png", "img1.png", "IMG01.GIF", "img2.JPG"};
String[] result = solution(files);
for(String res: result) bfw.write(res + "\n");
bfw.close();
}
}