반응형
문제
인풋으로 주어진 로그는 식별자와 내용으로 구성되어 있다.
로그의 타입은 숫자로만 이뤄진 숫자 로그와 알파벳으로만 이뤄진 문자 로그로 구분된다.
로그의 순서는 다음과 같아야 한다.
- 숫자 로그는 문자 로그의 뒤에 와야 한다.
- 문자 로그 간의 순서는 내용의 사전식 순서여야 한다.
- 문자 로그의 내용이 같다면 식별자의 사전식 순서로 정렬한다.
- 숫자 로그 간 순서는 유지해야 한다.
풀이
로그가 숫자 로그인지 문자 로그인지를 구분하는 함수를 만들었다.
그리고 문자 로그 리스트를 아래 조건대로 정렬한 다음 숫자 로그 리스트를 덧 붙여서 해결했다.
- 식별자를 제외한 로그의 알파벳 순서 비교
- 만약 같다면 식별자의 알파벳 순서 비교
코드
그냥 생각의 흐름대로 풀었다. 나중에 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;
}
}
참고
반응형