본문 바로가기
Algorithm/Problem_프로그래머스

프로그래머스([3차] 파일명 정렬) - Java

by uyoo 2020. 5. 18.

[3차 파일명 정렬]

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

 

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

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

programmers.co.kr

 

* 로직

  • 주어진 입력을 차례대로 탐색하며 Head, Number, Tail로 나눈다 (아스키 코드 활용)
  • 각 파일마다 Head, Number, Tail로 나눠졌다면 -> 파일의 원본, 입력된 순서 idx, Head, Number, Tail 를 관리하는 객체를 생성해 리스트에 담는다
  • 리스트에 모두 담겼다면 정렬 기준에 맞게 정렬을 진행한다
    • Head를 기준으로 오름차순 정렬
    • 만약 Head가 같다면
      • Number를 기준으로 오름차순 정렬
      • Number도 같다면 -> 입력된 순서 idx를 기준으로 오름차순 정렬
  • 정렬이 끝나면 답을 넣어준다

 

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

class FileInfo implements Comparable<FileInfo>{
    public String fileName;
    public int fileIdx;
    public String Head;
    public String Number;
    public String Tail;

    public FileInfo(String fileName, int fileIdx, String head, String number, String tail) {
        this.fileName = fileName;
        this.fileIdx = fileIdx;
        Head = head;
        Number = number;
        Tail = tail;
    }

    @Override
    public int compareTo(FileInfo o) {
        // Head를 기준으로 오름차순 정렬
        if(this.Head.toLowerCase().compareTo(o.Head.toLowerCase()) > 0) {
            return 1;
        }

        else if(this.Head.toLowerCase().compareTo(o.Head.toLowerCase()) == 0) {

            // Number 기준으로 오름차순 정렬
            if (Integer.parseInt(this.Number) - Integer.parseInt(o.Number) > 0) {
                return 1;
            }

            // HEAD 부분과, NUMBER의 숫자도 같을 경우
            else if(Integer.parseInt(this.Number) - Integer.parseInt(o.Number) == 0) {
                // 입력 순으로 오름차순 정렬
                return this.fileIdx - o.fileIdx;
            }
        }

        return -1;
    }
}

class Solution {
    public String[] solution(String[] files) {
        String[] answer = {};

        ArrayList<FileInfo> list = new ArrayList<>();
        for(int s=0; s<files.length; ++s) {
            String fileName = files[s];
            String Head = "";
            String Number = "";
            String Tail = "";

            StringBuilder sb = new StringBuilder();
            String name = fileName.toLowerCase();
            for(int i=0; i<name.length(); ++i) {
                char word = name.charAt(i);

                // 현재 문자가 알파벳 또는 - 인 경우 or Number를 담다가 다시 문자를 만나는 경우
                if((word-'a' >= 0 && word-'a' <= 26) || (word == '-' || word == '.' || word == ' ' )) {

                    // Head와 Number가 모두 갱신되었다면 -> 나머지는 Tail
                    if(!Number.equals("")) {
                        Tail += fileName.substring(i);
                        break;
                    }

                    else {
                        Head += fileName.charAt(i);
                    }
                }

                // 현재 문자가 숫자인 경우 -> 이Number를 담기
                else if(word-'0'>=0 && word-'0'<=57) {
                    Number += fileName.charAt(i);
                }
            }

            list.add(new FileInfo(fileName, s, Head, Number, Tail));
        }

        Collections.sort(list);
        answer = new String[list.size()];
        for(int i=0; i<answer.length; ++i) {
            answer[i] = list.get(i).fileName;
        }

        return answer;
    }
}