[3차 파일명 정렬]
https://programmers.co.kr/learn/courses/30/lessons/17686
* 로직
- 주어진 입력을 차례대로 탐색하며 Head, Number, Tail로 나눈다 (아스키 코드 활용)
- 각 파일마다 Head, Number, Tail로 나눠졌다면 -> 파일의 원본, 입력된 순서 idx, Head, Number, Tail 를 관리하는 객체를 생성해 리스트에 담는다
- 리스트에 모두 담겼다면 정렬 기준에 맞게 정렬을 진행한다
- Head를 기준으로 오름차순 정렬
- 만약 Head가 같다면
- Number를 기준으로 오름차순 정렬
- Number도 같다면 -> 입력된 순서 idx를 기준으로 오름차순 정렬
- 정렬이 끝나면 답을 넣어준다
import java.util.ArrayList;
import java.util.Collections;
class FileInfo implements Comparable<FileInfo>{
public String fileName;
public int fileIdx;
public String Head;
public String Number;
public String Tail;
public FileInfo(String fileName, int fileIdx, String head, String number, String tail) {
this.fileName = fileName;
this.fileIdx = fileIdx;
Head = head;
Number = number;
Tail = tail;
}
@Override
public int compareTo(FileInfo o) {
// Head를 기준으로 오름차순 정렬
if(this.Head.toLowerCase().compareTo(o.Head.toLowerCase()) > 0) {
return 1;
}
else if(this.Head.toLowerCase().compareTo(o.Head.toLowerCase()) == 0) {
// Number 기준으로 오름차순 정렬
if (Integer.parseInt(this.Number) - Integer.parseInt(o.Number) > 0) {
return 1;
}
// HEAD 부분과, NUMBER의 숫자도 같을 경우
else if(Integer.parseInt(this.Number) - Integer.parseInt(o.Number) == 0) {
// 입력 순으로 오름차순 정렬
return this.fileIdx - o.fileIdx;
}
}
return -1;
}
}
class Solution {
public String[] solution(String[] files) {
String[] answer = {};
ArrayList<FileInfo> list = new ArrayList<>();
for(int s=0; s<files.length; ++s) {
String fileName = files[s];
String Head = "";
String Number = "";
String Tail = "";
StringBuilder sb = new StringBuilder();
String name = fileName.toLowerCase();
for(int i=0; i<name.length(); ++i) {
char word = name.charAt(i);
// 현재 문자가 알파벳 또는 - 인 경우 or Number를 담다가 다시 문자를 만나는 경우
if((word-'a' >= 0 && word-'a' <= 26) || (word == '-' || word == '.' || word == ' ' )) {
// Head와 Number가 모두 갱신되었다면 -> 나머지는 Tail
if(!Number.equals("")) {
Tail += fileName.substring(i);
break;
}
else {
Head += fileName.charAt(i);
}
}
// 현재 문자가 숫자인 경우 -> 이Number를 담기
else if(word-'0'>=0 && word-'0'<=57) {
Number += fileName.charAt(i);
}
}
list.add(new FileInfo(fileName, s, Head, Number, Tail));
}
Collections.sort(list);
answer = new String[list.size()];
for(int i=0; i<answer.length; ++i) {
answer[i] = list.get(i).fileName;
}
return answer;
}
}
'Algorithm > Problem_프로그래머스' 카테고리의 다른 글
프로그래머스(두 정수 사이의 합) - Java (0) | 2020.05.20 |
---|---|
프로그래머스(나누어 떨어지는 숫자 배열) - Java (0) | 2020.05.20 |
프로그래머스([3차] n진수 게임) - Java (0) | 2020.05.18 |
프로그래머스(캐시, 압축) - Java (1) | 2020.05.14 |
프로그래머스([1차] 프렌즈 4블록) - Java (0) | 2020.05.12 |