[leetcode] 937. Reorder Data in Log Files

반응형

문제

 

인풋으로 주어진 로그는 식별자와 내용으로 구성되어 있다.

로그의 타입은 숫자로만 이뤄진 숫자 로그와 알파벳으로만 이뤄진 문자 로그로 구분된다.

로그의 순서는 다음과 같아야 한다.

  • 숫자 로그는 문자 로그의 뒤에 와야 한다.
  • 문자 로그 간의 순서는 내용의 사전식 순서여야 한다.
  • 문자 로그의 내용이 같다면 식별자의 사전식 순서로 정렬한다.
  • 숫자 로그 간 순서는 유지해야 한다.

풀이

로그가 숫자 로그인지 문자 로그인지를 구분하는 함수를 만들었다.

그리고 문자 로그 리스트를 아래 조건대로 정렬한 다음 숫자 로그 리스트를 덧 붙여서 해결했다.

  • 식별자를 제외한 로그의 알파벳 순서 비교
  • 만약 같다면 식별자의 알파벳 순서 비교

코드

그냥 생각의 흐름대로 풀었다. 나중에 solution이랑 discuss 확인해서 더 좋은 풀이를 학습해야겠다.

class Solution {

    public  String[] reorderLogFiles(String[] logs) {
        List<String> letters = new ArrayList<>();
        List<String> digits = new ArrayList<>();

        for (String log : logs) {
            String identifier = log.split(" ")[0];
            String logWoIdentifier = log.substring(identifier.length());

            if (isNumeric(logWoIdentifier)) {
                digits.add(log);
            } else {
                letters.add(log);
            }
        }

        letters.sort(
                (o1, o2) -> {
                    String identifier1 = o1.split(" ")[0];
                    String logWoIdentifier1 = o1.substring(identifier1.length());

                    String identifier2 = o2.split(" ")[0];
                    String logWoIdentifier2 = o2.substring(identifier2.length());

                    if (logWoIdentifier1.compareTo(logWoIdentifier2) == 0) {
                        return identifier1.compareTo(identifier2);
                    }

                    return logWoIdentifier1.compareTo(logWoIdentifier2);
                }
        );

        letters.addAll(digits);

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

    public  boolean isNumeric(String target) {

        for (char c : target.replaceAll(" ", "").toCharArray()) {
            if (!Character.isDigit(c)) {
                return false;
            }
        }
        return true;
    }
}

 

 

 


참고