LeetCode 937.Reorder Data in Log Files (Java)

Kim Yongbin·2024년 4월 10일
post-thumbnail

문제

https://leetcode.com/problems/reorder-data-in-log-files/description/

Code

1차 풀이 - 실패

class Solution {
    public String[] reorderLogFiles(String[] logs) {
        List<String> digitLogs = new ArrayList<>();
        Map<String, String> letterLogMap = new HashMap<>();

        for (String log : logs) {
            String[] logArray = log.split(" ", 2);

            if (Character.isDigit(logArray[1].charAt(0))) {
                digitLogs.add(log);
            } else {
                letterLogMap.put(logArray[0], logArray[1]);
            }
        }

        List<String> sortedLetterLog = letterLogMap.entrySet().stream()
                .sorted(Map.Entry.<String, String>comparingByValue()
                        .thenComparing(Map.Entry.comparingByKey()))
                .map(entry -> entry.getKey() + " " + entry.getValue())
                .collect(Collectors.toList());
        

        sortedLetterLog.addAll(digitLogs);

        return sortedLetterLog.toArray(new String[0]);
    }
}
  • Identifier가 같은 로그가 있을 경우 로그가 덮어씌워지면서 예외가 생긴다.

해설

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

        // log 분류하기
        for (String log: logs){
            if (Character.isDigit(log.split(" ", 2)[1].charAt(0))){
                digitList.add(log);
            } else {
                letterList.add(log);
            }
        }

        // 문자 로그 정렬하기
        letterList.sort((s1, s2) -> {
            // 식별자, 식별자 제외 부분으로 나누기
            String[] s1x = s1.split(" ", 2);
            String[] s2x = s2.split(" ", 2);

            int compared = s1x[1].compareTo(s2x[1]);

            if (compared == 0){
                return s1x[0].compareTo(s2x[0]);
            } else {
                return compared;
            }
        });

        // 문자 로그 + 숫자 로그
        letterList.addAll(digitList);
        return letterList.toArray(new String[0]);
    }
}
  1. Comparator를 이용하면 정렬조건을 설정할 수 있다.
    1. 두 값이 동일하다면0
    2. 비교 대상의 순서가 앞으로 와야 할 경우에는 1
    3. 비교 대상의 순서가 뒤로 가야할 경우에는 -1이 된다.

profile
반박 시 여러분의 말이 맞습니다.

0개의 댓글