Algorithm/코테 연습

[프로그래머스 코테 연습]자바 - [3차] 파일명 정렬

나맘임 2024. 7. 8. 21:48

개요

코딩테스트 연습 - [3차] 파일명 정렬 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

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

programmers.co.kr

난이도 : 레벨 2

특징 : 2018 KAKAO BLIND RECRUITMENT 기출 문제

 

첫인상이 너무나도 풀기 귀찮은 느낌을 받은 문제입니다.

 

다 풀고나도 심정은 변하지 않네요.

 

풀이법

import java.util.*;

class Solution {
    public String[] solution(String[] files) {


        ArrayList<SplitFile> splitFiles = new ArrayList<>();

        for (int i = 0; i < files.length; i++){
            String currentFileName = files[i];
            int startDigitIndex = -1;
            int endDigitIndex = currentFileName.length();

            for (int j = 0; j < currentFileName.length(); j++) {
                if (Character.isDigit(currentFileName.charAt(j))) {
                    startDigitIndex = j;
                    break;
                }
            }
            if (startDigitIndex != -1) {
                for (int j = startDigitIndex; j < currentFileName.length(); j++) {
                    if (!Character.isDigit(currentFileName.charAt(j))) {
                        endDigitIndex = j;
                        break;
                    }
                }
            }
            String head = currentFileName.substring(0,startDigitIndex);
            String number = currentFileName.substring(startDigitIndex, endDigitIndex);
            String tail = currentFileName.substring(endDigitIndex);

            splitFiles.add(new SplitFile(head,number,tail));
        }

        Collections.sort(splitFiles);

        String[] answer = new String[files.length];
        int index = 0;
        for (var i : splitFiles){
            answer[index++] = i.getEntireString();
        }

        return answer;
    }

    static class SplitFile implements Comparable<SplitFile>{
        String head;
        String number;

        String tail;

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

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

        @Override
        public int compareTo(SplitFile o) {
            int headComparison = head.toLowerCase().compareTo(o.head.toLowerCase());
            if (headComparison != 0) {
                return headComparison;
            } else {
                int thisNumber = Integer.parseInt(number);
                int otherNumber = Integer.parseInt(o.number);
                return Integer.compare(thisNumber, otherNumber);
            }
        }
    }
}

중요 포인트

1. 문제에서 요구한대로 정렬을 하기 위해 파일명을 head, number, tail 각각으로 나눈 SplitFile이라는 클래스를 만들고 compareTo() 를 사용하여 정렬 기준을 세웠다. String에서 비교는 String.compareTo를 사용하면 되고, Integer에서의 비교는 Integer.compare를 사용하면 된다. 이 문제에선 001과 1이 같기 때문에, int로 변환해주었다.

 

2. number만 뽑아낸다면 head와 tail은 자연스럽게 따라온다. 이를 위해 number의 시작점과 끝점을 찾아야한다. 이는 문자열을 처음부터 찾는 방식으로 두 반복문을 사용하여 인덱스를 뽑아냈다.

 

3. compareTo 메소드가 1을 반환하면 현재 값이 비교하고자한 값보다 크다는 것을 의미하고 0은 같음, -1은 작음을 의미한다.

 

 

과정

1. 반복문을 돌면서 파일명 전체를 확인한다. 확인할 때마다, head, number, tail로 쪼개야하기 때문에 number의 시작점을 startDigitIndex로, 끝점을 endDigitIndex로 정의한다.

 

2. 반복문을 두번 돌려서 startDigitIndex와 endDigitIndex를 찾는다.

 

3. String.subString을 사용하여 문자열을 추출한다. 이 때, beginIndex는 포함이 되지만 endIndex는 포함이 되지 않음을 주의한다!!

 

4. SplitFile은 comparable을 사용하여 비교 기준을 세웠기 때문에 바로 sort를 진행하고 결과값을 answer로 반환하면 된다.