카카오 - 파일명 정렬

greenTea·2023년 7월 21일
0
public class Main {
    public static String[] solution(String[] files) {
        List<String> list = new ArrayList<>(Arrays.asList(files));
        list.sort((a, b) -> {
            String head1 = getHead(a);
            String head2 = getHead(b);

            if (head1.equals(head2))
                return getNumber(a.toLowerCase(), head1) - getNumber(b.toLowerCase(), head2);

            return head1.compareTo(head2);
        });

        return list.toArray(new String[0]);
    }

    public static String getHead(String str) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < str.length(); i++) {
            char ch = str.charAt(i);
            if (Character.isDigit(ch)) {
                break;
            }
            sb.append(ch);
        }
        return sb.toString().toLowerCase();
    }

    public static int getNumber(String str, String head) {
        String replace = str.replace(head, "");

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < replace.length() && sb.length() < 5; i++) {
            char ch = replace.charAt(i);
            if (!Character.isDigit(ch)) {
                break;
            }
            sb.append(ch);
        }
        return Integer.parseInt(sb.toString());
    }
}

🫠안정 정렬의 개념이 필요한 문제입니다. 안정 정렬이란 정렬할 경우 같은 값의 경우 그 순서가 바뀌지 않는 것을 말합니다. (우선순위 큐를 이용해 풀려고 했지만 테스트 케이스 4부터 전부 실패로 발생하였고 우선순위 큐에서 리스트로 바꾸어서 풀어본 결과 통과하는 것을 확인 할 수 있었습니다.)

  1. 먼저 위 file들을 list에 넣어줍니다.
  2. list를 정렬하는데 먼저 head값을 기준으로 정렬을 시도합니다. head 값을 가져오는 방법은 숫자가 아닌 문자의 경우 StringBuilder에 값을 계속해서 더해줍니다. 만약 숫자가 나온 경우에는 지금까지 저장한 값을 반환해주면 됩니다. 이 때 조건에 대소문자를 구별하지 않는다고 하였으니 소문자로 변경해서 반환해주었습니다.
  3. 만약 head의 값이 같다면 number를 비교해주는데 위 head와 방식과는 반대로 숫자인 경우에만 더해주고 그 이외의 값이 나오면 멈춰줍니다. 이 대 숫자는 최대 5자리이므로 해당 조건을 걸어주면 됩니다.
  4. 정렬의 경우 문제의 조건과 같게 head 비교 후 같은 값이면 number를 비교해줍니다. 이 때 불안정 정렬을 사용 할 경우 순서가 바뀌게 되므로 주의해야합니다.

출처 : 프로그래머스 - [3차] 파일명 정렬

profile
greenTea입니다.

1개의 댓글

comment-user-thumbnail
2023년 7월 21일

자바 코드와 코드 설명이 매우 명확하고 이해하기 쉽게 작성되어 있어서 도움이 많이 되었습니다. 알고리즘의 핵심인 안정 정렬에 대한 설명이 특히 인상 깊었어요. 좋은 정보 공유해주셔서 감사합니다!

답글 달기