[프로그래머스][3차]파일명 정렬
2020. 4. 9. 21:47ㆍ프로그래머스/카카오
import java.util.*;
class Solution {
class divideFile{
String full;
String head;
String number;
divideFile(String full,String head,String number){
this.full = full;
this.head = head;
this.number = number;
}
}
public String[] solution(String[] files) {
String[] answer = new String[files.length];
int saveflag=0;
List<divideFile> compareFiles = new ArrayList<>();
for(int i=0; i<files.length; i++){
String full;
String head;
String number;
int headflag=0;
int tailflag=0;
for(int j=0; j<files[i].length(); j++){
if(files[i].charAt(j)>='0' && files[i].charAt(j)<='9'){
headflag = j;
break;
}
}
for(int j=headflag+1; j<files[i].length()-1; j++){
if(files[i].charAt(j)<'0' || files[i].charAt(j)>'9'){
tailflag = j;
break;
}
}
full = files[i];
head = files[i].substring(0,headflag);
head = head.toUpperCase();
if(tailflag-headflag<=5){
number = files[i].substring(headflag,tailflag);
}else{
number = files[i].substring(headflag,headflag+5);
}
for(int j=0; j<number.length(); j++){
if(number.charAt(j)!='0'){
number = number.substring(j);
break;
}
}
compareFiles.add(new divideFile(full,head,number));
}
compareFiles.sort((divideFile a,divideFile b)
-> a.head.equals(b.head)
? Integer.parseInt(a.number) - Integer.parseInt(b.number)
: a.head.compareTo(b.head));
for(int i=0; i<compareFiles.size(); i++){
System.out.println("full : " + compareFiles.get(i).full);
System.out.println("head : " + compareFiles.get(i).head);
System.out.println("number : " + compareFiles.get(i).number);
System.out.println("----------------------------");
}
for(int i=0; i<answer.length; i++){
answer[i] = compareFiles.get(i).full;
}
return answer;
}
}
문자열을 각각 풀네임, 헤드, 넘버로 나누어 가진 클래스로 바꾸어 객체별로 비교해서 풀었다.
일부 틀린 테스트 케이스가 나왔다.
import java.util.*;
class Solution {
public String[] solution(String[] input) {
String[] answer = input;
Arrays.sort(input, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
String tempNum = "";
String head1 = s1.split("[0-9]")[0];
s1 = s1.replace(head1, "");
head1 = head1.toUpperCase();
for(int i=0; i<s1.length(); i++){
if(s1.charAt(i)>='0' && s1.charAt(i)<='9'){
tempNum += Character.toString(s1.charAt(i));
}else{
break;
}
}
int num1 = Integer.parseInt(tempNum);
String head2 = s2.split("[0-9]")[0];
s2 = s2.replace(head2, "");
head2 = head2.toUpperCase();
tempNum = "";
for(int i=0; i<s2.length(); i++){
if(s2.charAt(i)>='0' && s2.charAt(i)<='9'){
tempNum += Character.toString(s2.charAt(i));
}else{
break;
}
}
int num2 = Integer.parseInt(tempNum);
if(head1.equals(head2)){
return num1-num2;
}else{
return head1.compareTo(head2);
}
}
});
return answer;
}
}
위와 차이점이 무엇인지 모르겠지만 클래스를 따로 설정하지 않고 Comparator를 이용하여 적절한 기준을 세워 정렬해주니 모두 통과하였다.
String head1 = s1.split("[0-9]")[0];
정규표현식을 통해 0~9가 포함되지 않은 문자열로 나눈 것중 첫번째를 헤드로 만들 수 있었다.
head1 과 head2를 toUpperCase( ) 해주지않고
head1.equalsIgnoreCase(head2) 를 해주면 왜 안되는지 모르겠다.
'프로그래머스 > 카카오' 카테고리의 다른 글
[프로그래머스][1차] 캐시 (0) | 2020.04.13 |
---|---|
[프로그래머스] 튜플 (0) | 2020.04.12 |
[프로그래머스][3차][압축] (0) | 2020.04.09 |
[프로그래머스] n진수 게임 (0) | 2020.04.08 |
[프로그래머스] 카카오프렌즈 컬러링북 (0) | 2020.04.04 |