코딩 테스트/프로그래머스

프로그래머스 - [3차] 파일명 정렬 문제 (자바)

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

 

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

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

programmers.co.kr

파일 이름을 head, number, tail로 분리 하고 comparable을 상속 받아서 

head가 다른 경우 head로 비교 정렬

head가 같은 경우 number를 숫자로 변환하여 비교 정렬

하면 끝이다.

 

ps

문자 비교시 대소문자를 구분 하지 않으므로 

equalsIgnoreCase(), compareToIgnoreCase()을 사용해야한다.

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

// 프로그래머스 파일명 정렬 문제
class FileName implements Comparable<FileName>{
    String head;
    String number;
    String tail;

    public String getFileName() {
        return head + number + tail;
    }

    public FileName(String name) {
        StringBuilder headBuilder = new StringBuilder();
        char[] chars = name.toCharArray();
        int idx = 0;
        while(idx < chars.length && (chars[idx] - '0' < 0 || chars[idx] - '0' > 9)) {
            headBuilder.append(chars[idx]);
            idx++;
        }
        head = headBuilder.toString();


        StringBuilder numberBuilder = new StringBuilder();
        while(idx < chars.length && chars[idx] - '0' >= 0 && chars[idx] - '0' <= 9) {
            numberBuilder.append(chars[idx]);
            idx++;
        }
        number = numberBuilder.toString();
        tail = name.substring(idx);
    }

    @Override
    public int compareTo(FileName o) {
        if(!head.equalsIgnoreCase(o.head)) {
            return head.compareToIgnoreCase(o.head);
        }
        return Integer.compare(Integer.parseInt(number), Integer.parseInt(o.number));
    }
}

class Solution {
    public String[] solution(String[] files) {
        List<FileName> fileNames = new ArrayList<>();
        String[] answer = new String[files.length];
        for (String fileName : files) {
            fileNames.add(new FileName(fileName));
        }

        Collections.sort(fileNames);

        for(int i = 0; i < answer.length; i++) {
            answer[i] = fileNames.get(i).getFileName();
        }
        return answer;
    }
}