프로그래밍공부/알고리즘

코딩테스트 - 파일명 정렬

중랑구보안관 2020. 8. 4. 14:13

프로그래머스 코딩테스트 문제중 카카오톡에 나왔던 파일명 정렬을 풀어보았다.

문제는 아래와 같다.

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

 

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

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

programmers.co.kr

 

요점은

1.파일명을 세등분하고 2. 세등분한 것을 이용하여 다중조건으로 정렬

을 하면 되는데 다행이 이와 관련된 것을 이미 해보아서 금방할 수 있었다.

 

문자열을 세등분 하는 것은 이전에 내가 했던 개인정보검출을 응용하였고

https://sheriffchae.tistory.com/category/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EA%B3%B5%EB%B6%80/%EC%9E%90%EB%B0%94

 

'프로그래밍공부/자바' 카테고리의 글 목록

이것저것 기록하기 위한 블로그 ^-^

sheriffchae.tistory.com

다중조건의 경우 이전에 본 경험이 있어서 아래 블로그를 참조했다.

https://chickenpaella.tistory.com/24

 

다중 조건 정렬

여러 조건을 만족하는 정렬을 구현해보자. 우선 정렬할 객체를 생성할 클래스를 작성한다. 여기서는 Student로 하겠다. 1 2 3 4 5 6 7 8 9 10 11 class Student {     int num;     String name;   ..

chickenpaella.tistory.com

 

결과는 합격.

코드는 아래와 같다.

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.Comparator;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;

class Solution {
    public String[] solution(String[] files) {
       //정렬을 위한 자료구조
        List<File> list = new ArrayList<File>();
        //String headRe = "[a-zA-Z]+";
        String numRe = "[0-9]{1,5}";
        //String tailRe = "[a-zA-Z]+[0-9]+?";
        int index=0;
        //head number tail을 구분하기위한 로직.
        for(String fileName:files){
            Pattern pattern = Pattern.compile(numRe);
            Matcher matcher = pattern.matcher(fileName);
            int start = 0;
            int last = 0;
            if(matcher.find()){
                start=matcher.start(); //number시작인덱스
                last=matcher.end(); //number 마지막인덱스
            }
            //파일이름에서 head와 number, tail을 인덱스를 이용하여 추출해 낸다.
            String head = fileName.substring(0,start);
            String number = fileName.substring(start,last);
            String tail = fileName.substring(last,fileName.length());
            list.add(new File(head,Integer.parseInt(number),tail,index));
            index++;
        }
        //정렬
        Collections.sort(list, new FileCompare());
        String[] answer = new String[list.size()];
        index=0;
        //답을 추출해내는 곳.
        for(File file:list){
            answer[index]=files[file.index];
            index++;
        }

        return answer;
    }
    
    //자료를 저장하기위한 클래스
    class File {
        String head;
        int number;
        String tail;
        int index;

        public File(String head,int number,String tail,int index){
            this.head=head;
            this.number=number;
            this.tail=tail; 
            this.index=index;
        }
    }
    
    //다중조건으로 비교하기위한 클래스
    //순서는 head-number-index순이다.
    class FileCompare implements Comparator<File> {
        int ret=0;
		@Override
		public int compare(File o1, File o2) {
            //대소문자구분없이 비교하기 위해 toLowerCase사용
			if(o1.head.toLowerCase().compareTo(o2.head.toLowerCase()) < 0){
                ret = -1;
            }
            if(o1.head.toLowerCase().compareTo(o2.head.toLowerCase()) == 0 ) {
                if(o1.number == o2.number){
                    //head, number가 같은경우 인덱스가 빠른쪽이 앞에오도록 한다,
                    //(그래야 원래 순서와 변함이 없다.)
                   if(o1.index > o2.index) {
                        ret = 1;
                    } else if(o1.index == o2.index) {
                        ret = 0;
                    } else if(o1.index < o2.index ) {
                        ret = -1;
                    } 
                } else if(o1.number < o2.number) {
                    ret = -1;
                } else if(o1.number > o2.number) {
                    ret = 1;
                }
            }
            if(o1.head.toLowerCase().compareTo(o2.head.toLowerCase()) > 0) {
                ret = 1;
            }
            return ret;
		}
	}
}

 

만약 여기서 한단계 더 나아간다면 head number tail을 구하는 로직이 반복되기 때문에 따로 메소드로 만들어주면

더 깔끔해질 것이다

 

-끝-