[프로그래머스] 카카오_파일명 정렬 (자바 풀이)

문제

https://programmers.co.kr/learn/courses/30/lessons/17686?language=java 

 

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

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

programmers.co.kr

풀이

이 문제를 자바를 이용해 풀기 위해서는 comparable 인터페이스에 대해 알면 좋다. 나는 File 이라는 class를 만들어 comparable 인터페이스를 implements 하게 하였고, compareTo 함수를 오버라이딩하여 문제에 맞게 정렬할 수 있도록 설정하였다. 

 

자세한 내용은 코드를 참고하면 알 수 있다.

코드

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import java.util.*;
 
class Solution {
    public String[] solution(String[] files) {
        String[] answer;
        ArrayList<File> list = new ArrayList<>();
        
        for(int i=0; i<files.length; i++){
            list.add(new File(files[i]));    
        }
        answer = new String[list.size()];
        
        Collections.sort(list);    // 정렬
        
        for(int i=0; i<list.size(); i++){
            answer[i] = list.get(i).head + list.get(i).number + list.get(i).tail;
        }        
                
        return answer;
    }
    
    static class File implements Comparable<File>{
        int num;    // 들어온 순서
        String head="";
        String number="";
        String tail="";
        
        /* 생성자-parsing */
        File(String str){
            int idx=0;
            while(true){    // 숫자를 만나면 break
                if(str.charAt(idx)>='0' && str.charAt(idx) <='9'break;
                idx++;
            }
            this.head = str.substring(0,idx);
            
            String tmp = "";
            while(true){
                tmp += str.charAt(idx);
                idx++;
                if(idx >= str.length() || str.charAt(idx) < '0' || str.charAt(idx) >'9'break;
            }
            this.number = tmp;
            
            if(idx < str.length()){
                this.tail = str.substring(idx);
            }
            
        }
        
        @Override
        public int compareTo(File o){
            /* head 소문자로 변경 */
            String str1 = this.head.toLowerCase();
            String str2 = o.head.toLowerCase();
            if(str1.equals(str2)) {    // head가 같다면
                int num1 = Integer.parseInt(this.number);
                int num2 = Integer.parseInt(o.number);
                if(num1 == num2){    // number가 같다면
                    return this.num - o.num; // 들어온 순서대로
                }
                return num1-num2;    // number 순서대로
            }
            
            return str1.compareTo(str2);    // head 순서대로
        }
    }
}
cs

결과

결과

반응형

댓글

Designed by JB FACTORY