devFancy BE Developer

[Programmers] 17686. [3차] 파일명 정렬

2023-10-10
devFancy

문제 링크

성능 요약

  • 메모리: 77 MB, 시간: 18.81 ms

구분

  • 코딩테스트 연습 > 문자열, 구현

Answer Code1(23.10.10)

import java.util.Arrays;
import java.util.Comparator;

class Solution {

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


        File[] file_info = new File[files.length];

        for (int i = 0; i < files.length; i++) {
            String[] split = splitFileName(files[i]);
            file_info[i] = new File(files[i], split[0], Integer.parseInt(split[1]));
        }

        Arrays.sort(file_info, new Comparator<File>() {
            @Override
            public int compare(File o1, File o2) {
                if ((o1.head).equals(o2.head)) { 	// HEAD 부분이 같다면 
                    return o1.number-o2.number; 	// NUMBER 오름차순 정렬
                }else{
                    return (o1.head).compareTo(o2.head); // HEAD 부분을 기준으로 사전 순 정렬
                }
            }
        });

        String[] answer = new String[files.length];
        for (int i = 0; i < files.length; i++) {
            answer[i] = file_info[i].file_name;
        }

        return answer;
    }

    static class File {
        String file_name;
        String head;
        int number;

        public File(String file_name, String head, int number) {
            this.file_name = file_name;
            this.head = head;
            this.number = number;
        }
    }
    
    // file name을 head, number, tail로 나누는 함수
    public static String[] splitFileName(String file) {
        String str[] = new String[3];
        str[0] = ""; // HEAD
        str[1] = ""; // NUMBER
        str[2] = ""; // TAIL

        int idx = 0;
        for (int i = 0; i < file.length(); i++) {
            char c = file.charAt(i);

            if(idx==0 && !Character.isDigit(c)){ // 현재 처리 중인 부분이 HEAD이며, 현재 문자가 숫자가 아닌 경우
                str[idx] += c;
                continue;
            }

            if(idx==0 && Character.isDigit(c)){ // 현재 처리 중인 부분이 HEAD이며, 현재 문자가 숫자인 경우
                idx ++;
            }

            if(idx==1 && Character.isDigit(c)){ // 현재 처리 중인 부분이 NUMBER이며, 현재 문자가 숫자인 경우
                str[idx] += c;
                continue;
            }

            if(idx==1 && !Character.isDigit(c)){ // 현재 처리 중인 부분이 NUMBER이며, 현재 문자가 숫자가 아닌 경우
                idx ++;
            }
            str[idx] += c;
        }

        str[0] = str[0].toLowerCase(); // 대소문자 구분 X, 소문자로 변환

        return str;
    }
}

Review

  • 해당 문제는 문자열을 이용한 구현 문제인데, File과 정렬에 대한 개념이 활용해서 그런지 난이도가 꽤 있었다.

  • 프로그래머스 Lv2이지만, 해당 문제를 통해 여러 개념을 알 수 있어서 좋았다.

  • 배열인 경우에는 Array.sort() 를 사용하고 List인 경우에는 Collections.sort()를 사용한다는 걸 기억해두자.

Reference


Comments

Index