[LeetCode 937] Reorder Data in Log Files (Java)

codingNoob12·2025년 4월 24일

알고리즘

목록 보기
66/77


풀이

이 문제는 문자열 배열인 logs가 주어졌을 때, logs를 조건에 맞게 재정렬하는 문제이다.

이 때, 문자 로그와 숫자 로그의 정렬 방식이 상이함을 알 수 있다.

따라서 문자 로그와 숫자 로그를 분리한 뒤, 각각 정렬한 뒤 둘을 연결하여 해결하는 것이 유리할 것이다.

먼저, log는 공백으로 구분되는 단어 문자열로 구성되어 있고, 첫 번째 단어가 구분자(identifier)이다. 이 때 log는 문자 로그와 숫자 로그로 구분이 되는데, 문자 로그는 구분자를 제외한 모든 단어들이 영어 소문자로 구성되어 있고, 숫자 로그는 구분자를 제외한 모든 단어들이 숫자들로 구성되어 있다.

따라서, 문자 로그와 숫자 로그를 구별하는 방법은 내용의 첫번째 단어의 첫번째 문자가 숫자인지 판별해보기만 하면 된다.

만약 숫자라면 숫자 로그이고, 문자라면 문자 로그인 것으로 판단하면 된다.

이후, 문자 로그들을 내용에 따라 사전순 정렬하되, 내용이 같다면 구분자를 기준으로 사전순 정렬한다.

그리고, 숫자 로그들은 순서를 유지하라고 하였으므로, 문자 로그들 뒤에 숫자 로그들을 추가해주면 문제에서 요구한대로 재정렬이 된다.

이를 코드로 옮기면 다음과 같다.

class Solution {
    public String[] reorderLogFiles(String[] logs) {
        List<String> letterLogs = new ArrayList<>();
        List<String> digitLogs = new ArrayList<>();

        for (String log : logs) {
            String[] pair = log.split(" ", 2);
            if (Character.isDigit(pair[1].charAt(0)))
                digitLogs.add(log);
            else
                letterLogs.add(log);
        }

        letterLogs.sort((a, b) -> {
            String[] pair1 = a.split(" ", 2);
            String[] pair2 = b.split(" ", 2);

            if (!pair1[1].equals(pair2[1]))
                return pair1[1].compareTo(pair2[1]);
            
            return pair1[0].compareTo(pair2[0]);
        });

        letterLogs.addAll(digitLogs);

        return letterLogs.toArray(new String[0]);
    }
}
profile
나는감자

0개의 댓글