파일명 정렬 - 자바
문제 링크
https://programmers.co.kr/learn/courses/30/lessons/17686
풀이 방법
이번 문제는 정렬과 문자열 문제이다. HEAD를 기준으로 정렬을 우선 하고 같을경우 숫자순으로 정렬하고 같을 경우 입력된 순서로 정렬한다. 이러한 조건이 있는 정렬문제는 정렬을 커스텀할 수 있는 능력이 필요하다. 하지만 이번 문제는 정렬보단 문자열 다루는 것이 어렵게 느껴졌다.
특히 앞의 0을 제거하되, 5개 숫자만을 허용하는 NUMBER를 구성하기 어려웠다.
1. split을 잘사용하자(정규식을 활용 "[A-Z]" 여러개일 경우 | 이용)
2. toUpperCase,toLowerCase 알아두자
3. 정렬 시 return 값은 왼쪽 - 오른쪽 = 오름차순 (오른쪽 - 왼쪽 = 내림차순)
혹은
왼쪽 - 오른쪽 > 0 일때 양수 리턴, 왼쪽 - 오른쪽 = 0 일때 0 리턴, 왼쪽 - 오른쪽 < 0 음수 리턴 => 오름차순
왼쪽 - 오른쪽 > 0 일때 음수 리턴, 왼쪽 - 오른쪽 = 0 일때 0 리턴, 왼쪽 - 오른쪽 < 0 양수 리턴 => 내림차순
4. 문자가 숫자인지 확인하는 방법은 Character.isDigit이다.
Character.isLetter = 알파벳확인
Character.isUpperCase = 대문자확인
5. 기준값.compareTo(대상) = 기준값>대상일 경우 양수, 기준값=대상일 0, 기준값<대상일 경우 음수
나의 코드
import java.util.*;
class Solution {
public String[] solution(String[] files) {
String[] answer = files;
Arrays.sort(answer,(s1,s2)->{
String tmp1 = s1;
String tmp2 = s2;
tmp1 = tmp1.toUpperCase();
tmp2 = tmp2.toUpperCase();
String head1 = tmp1.split("[0-9]")[0];
String head2 = tmp2.split("[0-9]")[0];
String number1 = convert(tmp1,head1);
String number2 = convert(tmp2,head2);
if(head1.compareTo(head2)>0){
return 1;
}
else if(head1.compareTo(head2)==0){
if(Integer.valueOf(number1)-Integer.valueOf(number2)>0){
return 1;
}
else if(Integer.valueOf(number1)-Integer.valueOf(number2)==0){
return 0;
}
else{
return -1;
}
}
else{
return -1;
}
});
return answer;
}
public String convert(String s, String head){
String tmp = s.substring(head.length());
StringBuffer res = new StringBuffer("");
for(int i=0;i<tmp.length();i++){
if(Character.isDigit(tmp.charAt(i))&&res.length()<5){
res.append(String.valueOf(tmp.charAt(i)));
}
else{
break;
}
}
return res.toString();
}
}
Author And Source
이 문제에 관하여(파일명 정렬 - 자바), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@ksh9409255/파일명-정렬-자바
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
이번 문제는 정렬과 문자열 문제이다. HEAD를 기준으로 정렬을 우선 하고 같을경우 숫자순으로 정렬하고 같을 경우 입력된 순서로 정렬한다. 이러한 조건이 있는 정렬문제는 정렬을 커스텀할 수 있는 능력이 필요하다. 하지만 이번 문제는 정렬보단 문자열 다루는 것이 어렵게 느껴졌다.
특히 앞의 0을 제거하되, 5개 숫자만을 허용하는 NUMBER를 구성하기 어려웠다.
1. split을 잘사용하자(정규식을 활용 "[A-Z]" 여러개일 경우 | 이용)
2. toUpperCase,toLowerCase 알아두자
3. 정렬 시 return 값은 왼쪽 - 오른쪽 = 오름차순 (오른쪽 - 왼쪽 = 내림차순)
혹은
왼쪽 - 오른쪽 > 0 일때 양수 리턴, 왼쪽 - 오른쪽 = 0 일때 0 리턴, 왼쪽 - 오른쪽 < 0 음수 리턴 => 오름차순
왼쪽 - 오른쪽 > 0 일때 음수 리턴, 왼쪽 - 오른쪽 = 0 일때 0 리턴, 왼쪽 - 오른쪽 < 0 양수 리턴 => 내림차순
4. 문자가 숫자인지 확인하는 방법은 Character.isDigit이다.
Character.isLetter = 알파벳확인
Character.isUpperCase = 대문자확인
5. 기준값.compareTo(대상) = 기준값>대상일 경우 양수, 기준값=대상일 0, 기준값<대상일 경우 음수
import java.util.*; class Solution { public String[] solution(String[] files) { String[] answer = files; Arrays.sort(answer,(s1,s2)->{ String tmp1 = s1; String tmp2 = s2; tmp1 = tmp1.toUpperCase(); tmp2 = tmp2.toUpperCase(); String head1 = tmp1.split("[0-9]")[0]; String head2 = tmp2.split("[0-9]")[0]; String number1 = convert(tmp1,head1); String number2 = convert(tmp2,head2); if(head1.compareTo(head2)>0){ return 1; } else if(head1.compareTo(head2)==0){ if(Integer.valueOf(number1)-Integer.valueOf(number2)>0){ return 1; } else if(Integer.valueOf(number1)-Integer.valueOf(number2)==0){ return 0; } else{ return -1; } } else{ return -1; } }); return answer; } public String convert(String s, String head){ String tmp = s.substring(head.length()); StringBuffer res = new StringBuffer(""); for(int i=0;i<tmp.length();i++){ if(Character.isDigit(tmp.charAt(i))&&res.length()<5){ res.append(String.valueOf(tmp.charAt(i))); } else{ break; } } return res.toString(); } }
Author And Source
이 문제에 관하여(파일명 정렬 - 자바), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ksh9409255/파일명-정렬-자바저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)