[Programmers] [3차] 파일명 정렬 - 2018 KAKAO BLIND RECRUITMENT

동민·2021년 3월 11일
0
import java.util.Arrays;
import java.util.Comparator;

// [3차] 파일명 정렬 - 2018 KAKAO BLIND RECRUITMENT
public class FileSort {
	
	/*
	 * [자바 정규식 활용]
	 * 
	 * str = str.replaceAll("[0-9]", ""); -> 문자만 추출(숫자제거)
	 * str = str.replaceAll("[^0-9]", ""); -> 숫자만 추출(문자제거) ; 메타문자열에서 ^는 not을 의미
	 * 
	 */

	public String[] solution(String[] files) {

		Arrays.sort(files, new Comparator<String>() {

			public int compare(String s1, String s2) {

				s1 = cutTail(s1);
				s2 = cutTail(s2);

				if (Integer.parseInt(s1.replaceAll("[^0-9]", "")) > Integer.parseInt(s2.replaceAll("[^0-9]", ""))) { // 자바 정규식 활용
					return 1;
				} else if (Integer.parseInt(s1.replaceAll("[^0-9]", "")) < Integer.parseInt(s2.replaceAll("[^0-9]", ""))) {
					return -1;
				}
				return 0;
			}
		});

		Arrays.sort(files, new Comparator<String>() {
			public int compare(String s1, String s2) {
				s1 = cutTailAndNum(s1);
				s2 = cutTailAndNum(s2);

				if (s1.replaceAll("[0-9]", "").toLowerCase().compareTo(s2.replaceAll("[0-9]", "").toLowerCase()) > 0) {
					return 1;
				}
				if (s1.replaceAll("[0-9]", "").toLowerCase().compareTo(s2.replaceAll("[0-9]", "").toLowerCase()) < 0) {
					return -1;
				}
				return 0;
			}
		});
		return files;
	}

	public static String cutTailAndNum(String str) {
		for (int i = 1; i < str.length(); i++) {
			if (str.charAt(i) >= '0' && str.charAt(i) <= '9') {
				str = str.substring(0, i);
				break;
			}
		}
		return str;
	}

	public static String cutTail(String str) {
		for (int i = 1; i < str.length(); i++) {
			if ((str.charAt(i) < '0' || str.charAt(i) > '9')
					&& (str.charAt(i - 1) >= '0' && str.charAt(i - 1) <= '9')) {
				str = str.substring(0, i);
				break;
			}
		}
		return str;
	}

}
자바 정규식 참고 : https://offbyone.tistory.com/400

str = str.replaceAll("[^0-9]", ""); : 0 ~ 9 가 아닌 문자(숫자가 아닌 문자)""로 치환. 즉 숫자만 추출
str = str.replaceAll("[0-9]", ""); : 0 ~ 9 숫자를 ""로 치환. 즉 문자만 추출(메타 문자열에서 ^은 not을 의미)
profile
BE Developer

0개의 댓글

관련 채용 정보