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(); } }