<나의풀이>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | import java.util.*; class Solution { public String[] solution(String[] files) { String[] answer = {}; Arrays.sort(files,new Comparator<String>(){ @Override public int compare(String s1, String s2){ String head1 = s1.split("[0-9]")[0]; String head2 = s2.split("[0-9]")[0]; head1=head1.toUpperCase(); head2=head2.toUpperCase(); int headsort = head1.compareTo(head2); if(headsort==0){ String numtail1 = s1.substring(head1.length()); String numtail2 = s2.substring(head2.length()); StringBuffer num1 = new StringBuffer(""); StringBuffer num2 = new StringBuffer(""); for(char c : numtail1.toCharArray()) { if(Character.isDigit(c) && num1.length()<=5) num1.append(c); else break; } for(char c : numtail2.toCharArray()) { if(Character.isDigit(c) && num2.length()<=5) num2.append(c); else break; } return Integer.parseInt(num1.toString()) - Integer.parseInt(num2.toString()); }else{ return headsort; } } }); return files; } } | cs |
처음 문제를 접했을 때 compare을 이용하는 문제임을 파악함. 그러나 Array.sort를 잊어버리고 배열을 하나씩 비교하여 정렬 해야 하나 고민에 빠짐. 결국 힌트를 보고 Array.sort가 배열을 모두 비교하고 정렬한다는 것을 기억하고 문제를 품.
<다른사람풀이>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | import java.util.*; class Solution { public String[] solution(String[] files) { Arrays.sort(files, new StrCmp()); return files; } private class StrCmp implements Comparator<String> { @Override public int compare(String s1, String s2) { s1 = s1.toLowerCase(); s2 = s2.toLowerCase(); int i = 0; int j = 0; while (i < s1.length() && !Character.isDigit(s1.charAt(i))) ++i; while (j < s2.length() && !Character.isDigit(s2.charAt(j))) ++j; int cmp1 = s1.substring(0, i).compareTo(s2.substring(0, j)); if (cmp1 != 0) return cmp1; int startI = i; int startJ = j; while (i < s1.length() && Character.isDigit(s1.charAt(i))) ++i; while (j < s2.length() && Character.isDigit(s2.charAt(j))) ++j; int num1 = Integer.parseInt(s1.substring(startI, i)); int num2 = Integer.parseInt(s2.substring(startJ, j)); return num1 - num2; } } } | cs |
익명 클래스가 아닌 클래스를 만들고 사용함. 원리는 같으나 중간 풀이가 다름.
split이 아닌 while을 이용하여 head를 구하고 number는 for문이 아닌 while을 이용하여 좀더 가독성이 뛰어남.