codingTest
[Java] leetcode 937. Reorder Data in Log Files
i-m-okay
2024. 10. 28. 13:29
어제 푼 문제인데, 간단한듯 하지만 java 메서드에 대해 잘 모르는 나에겐 신기한 문제였다.
문제 분석
로그를 배열하는데, 다음과 같이 두 종류가 있다.
- Letter-logs : 모두 영어 소문자
- Digit-logs : 모두 숫자
재정렬하여 반환하는 문제인데, 아래와 같은 규칙을 따라야 한다.
- letter-logs가 digit-logs보다 앞에 와야 한다.
- letter-logs는 사전순으로 배열한다.
- 동일한 경우, idx 순
- 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"]
사고의 흐름
- Letter-logs와 Digit-logs를 나눈다.
- letter-logs 정렬
- 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을 끝낸다.