Step-by-Step

[Java] 프로그래머스 - 파일명 정렬 본문

언어/JAVA

[Java] 프로그래머스 - 파일명 정렬

희주(KHJ) 2022. 1. 5. 13:15

https://programmers.co.kr/learn/courses/30/lessons/17686

 

코딩테스트 연습 - [3차] 파일명 정렬

파일명 정렬 세 차례의 코딩 테스트와 두 차례의 면접이라는 기나긴 블라인드 공채를 무사히 통과해 카카오에 입사한 무지는 파일 저장소 서버 관리를 맡게 되었다. 저장소 서버에는 프로그램

programmers.co.kr

파일명에 따라 파일을 순서대로 정리하는 코드를 작성하는 문제이다

파일명은 크게 가지 파트로 나눌 수 있는데,

1. 파일 이름의 문자파트를 나타내는 HEAD (처음 ~ 숫자파트 전까지)

2. 파일 이름의 숫자파트를 나타내는 NUMBER

3. 나머지 부분인 TAIL (숫자파트 이후~끝까지 / 없을 수 있음)

 

파일 정리는 HEAD > NUMBER > TAIL 의 우선순위로 정렬한다

처음에는 파일을 반복문으로 돌려서 일일이 비교하려고 했는데, 효율성과 가독성 측면에서 그닥 좋지 않았다

JAVA의 기능 중에 배열을 정리하는 Arrays.sort() 메소드를 이용하였다

Arrays.sort(T[] a, Comparator<? super T> c) 처럼 Comparator를 이용하여 정렬 형식을 지정할 수 있다

Comparator<String> 객체를 생성하여 넣어주고 compare를 Override 하여 HEAD 부분을 먼저 비교하고,

HEAD가 동일하다면 NUMBER 부분을 비교하여 정렬하도록 하였다

NUMBER 부분은 따로 메소드를 만들어 숫자 부분만 비교했다

import java.util.*;

public class Solution{
	public static void main(String[] args){
		String[] files = {"img12.png", "img10.png", "img02.png", "img1.png", "IMG01.GIF", "img2.JPG"};
				
		Arrays.sort(files, new Comparator<String>() {
			@Override
			public int compare(String str1, String str2) {
				String head1 = str1.split("[0-9]")[0]; // 숫자 앞 부분 -> 배열 인덱스 0인 부분
				String head2 = str2.split("[0-9]")[0];
				
				int result = head1.toLowerCase().compareTo(head2.toLowerCase()); //모두 소문자로 바꿔 비교
				
				if(result == 0) {	//HEAD 부분이 같을 경우
					result = compareNum(str1.substring(head1.length())) - compareNum(str2.substring(head2.length()));
				}
				
				return result;
			}
			
		});
		
		for(String str : files) {
			System.out.println(str);
		}
	}
	
	public static int compareNum(String str) {	
		String result = "";
		
		for(char ch : str.toCharArray()) {
			if(Character.isDigit(ch) && result.length() < 5) //NUMBER 부분만 보기위함
				result += ch;
			else
				break;
		}
		return Integer.valueOf(result);
	}
}

 

 

[참조]

https://subin-0320.tistory.com/103

Comments