codingTest

[Java] leetcode 937. Reorder Data in Log Files

i-m-okay 2024. 10. 28. 13:29

어제 푼 문제인데, 간단한듯 하지만 java 메서드에 대해 잘 모르는 나에겐 신기한 문제였다.

문제 분석

로그를 배열하는데, 다음과 같이 두 종류가 있다.

  1. Letter-logs : 모두 영어 소문자
  2. Digit-logs : 모두 숫자

재정렬하여 반환하는 문제인데, 아래와 같은 규칙을 따라야 한다.

  1. letter-logs가 digit-logs보다 앞에 와야 한다.
  2. letter-logs는 사전순으로 배열한다.
    • 동일한 경우, idx 순
  3. digit-logs는 입력 순서를 유지한다.

입출력 예시

Input: logs = ["dig1 8 1 5 1","let1 art can","dig2 3 6","let2 own kit dig","let3 art zero"]
Output: ["let1 art can","let3 art zero","let2 own kit dig","dig1 8 1 5 1","dig2 3 6"]

사고의 흐름

  1. Letter-logs와 Digit-logs를 나눈다.
  2. letter-logs 정렬
  3. Digit-logs와 붙인다.

풀이

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

      // Letter-logs와 Digit-logs를 나누어 저장
      for (String log : logs) {
        if (Character.isDigit(log.split(" ")[1].charAt(0))) {
          digitLogs.add(log);
        } else {
          letterLogs.add(log);
        }
      }

      // letter-logs 정렬
      letterLogs.sort((s1, s2)->{
        String[] s1x = s1.split(" ",2);
        String[] s2x = s2.split(" ",2);

        // letter-logs의 내용이 같을 경우, 인덱스로 구분
        int compared = s1x[1].compareTo(s2x[1]);
        if(compared == 0) {
          return s1x[0].compareTo(s2x[0]);
        } else {
          return compared;
        }
      });

      letterLogs.addAll(digitLogs);

      return letterLogs.toArray(new String[0]);

  }
}

Character.isDigit()

특정 문자가 숫자이면 true, 아니면 false 반환

 

s1.compareTo(s2)

문자열 s1과 s2를 비교하여 값을 반환한다.

- 순서가 동일한 경우 0

- 순서가 앞인 경우 1

- 순서가 뒤인 경우 -1

 

ArrayList.sort()

comparator의 반환값에 따라 배열을 정렬한다.

compareTo()를 이용할 수 있다.

 

 

s1.split(" ", limit)

문자열 s1을 구분자에 따라 나누어 배열에 저장한다. limit은 해당 구분자가 문자열에 여러 개 포함되어 있을 경우, 몇번째 구분자에서 쪼개기를 멈출 것인지 정할 수 있다. limit에 해당되는 수는 쪼개는 범위에 포함되지 않는다. s1.split(" ", 2) 일 경우, s1을 " "(공백)에 따라 나누되, 첫번째 (limit-1) 에서 split하고, 두번째(limit)에서 (쪼개지 않고) split을 끝낸다.