파일명 정렬 - 자바

문제 링크

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

좋은 웹페이지 즐겨찾기