Algorithm/programmers

[2018 카카오 블라인드 3차]파일명 정렬

마닐라 2022. 7. 6. 10:40

📍 문제 설명

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

💡 접근

문자열 관련 문제 였다.

1. HEAD, NUMBER, TAIL 부분을 알맞게 파싱한다.

2. 원본 파일명을 그대로 출력해야 하니 File 클래스를 따로 만들어서 원본 데이터를 저장한다.

3. Comparable을 구현해서 주어진 정렬에 맞게 구현한다.

 

 

👩‍💻 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;

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

        ArrayList<File> list = new ArrayList<File>();
        String s = ".- ";

        for(String file : files) {
            //NUMBER의 시작과 끝 idx를 기억하여 파싱
            int start = 0, end = 0;
            char[] ch = file.toCharArray();
            boolean flag = false;
            for(int i = 0; i < ch.length; i++) {
                //숫자 확인
                if(Character.isDigit(ch[i]) && !flag) {
                    start = i;
                    flag = true;
                }
                //문자 확인
                else if((Character.isLetter(ch[i]) && flag) || (s.contains(ch[i]+"") && flag)) {
                    end = i;
                    break;
                }
            }
            String number = "", tail = "";
            String head = file.substring(0, start);
            if(end != 0) number = file.substring(start, end);
            else number = file.substring(start);
            if(end != 0) tail = file.substring(end);
            list.add(new File(head, number, tail));
        }
        Collections.sort(list);
        answer = new String[list.size()];
        for(int i = 0; i < list.size(); i++) {
            answer[i] = list.get(i).head+list.get(i).number+list.get(i).tail;
        }

        System.out.println(Arrays.toString(answer));

        return answer;
    }

    private class File implements Comparable<File> {
        private String head;
        private String number;
        private String tail;

        public File(String head, String number, String tail) {
            this.head = head;
            this.number = number;
            this.tail = tail;
        }

        @Override
        public int compareTo(File o) {
            if(o.head.equalsIgnoreCase(this.head) ) {
                if(Integer.valueOf(o.number) == Integer.valueOf(this.number)) {
                    return 0;
                } else return Integer.compare(Integer.valueOf(this.number), Integer.parseInt(o.number));
            }
            return this.head.toLowerCase().compareTo(o.head.toLowerCase());
        }

        @Override
        public String toString() {
            return "File{" +
                    "head='" + head + '\'' +
                    ", number='" + number + '\'' +
                    ", tail='" + tail + '\'' +
                    '}';
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Main t = new Main();
        //String[] s = {"foo9.text", "foo010bar020.zip", "f-15"};
        //String[] s = {"img12.png", "img10.png", "img02.png", "img1.png", "IMG01.GIF", "img2.JPG"};
        String[] s = {"F-5 Freedom Fighter", "B-50 Superfortress", "A-10 Thunderbolt II", "F-14 Tomcat", "F-4", "F-5", "-4"};
        t.solution(s);

    }
}