03. 로그파일 재정렬
📌문제
로그를 재정렬하라. 기준은 다음과 같다.
>1. 로그의 가장 앞 부분은 식별자다.
2. 문자로 구성된 로그가 숫자 로그보다 앞에 온다.
3. 식별자는 순서에 영향을 끼치지 않지만, 문자가 동일한 경우 식별자 순으로 한다.
4. 숫자 로그는 입력 순서대로 한다.
- 예제1
📝입력
`["dig1 8 1 5 1","let1 art can","dig2 3 6","let2 own kit dig","let3 art zero"]`
💻출력
`["let1 art can","let3 art zero","let2 own kit dig","dig1 8 1 5 1","dig2 3 6"]`
- 예제2
📝입력
`["a1 9 2 3 1","g1 act car","zo4 4 7","ab1 off key dog","a8 act zoo"]`
💻출력
`["g1 act car","a8 act zoo","ab1 off key dog","a1 9 2 3 1","zo4 4 7"]`
<BR>
📌풀이
1. Comparator의 sort 재정의(람다식) (6ms, 43.1mb)
public String[] reorderLogFiles(String[] logs) {
Arrays.sort(logs, (s1, s2)->{
// 식별자 데이터값 으로 나눈다.
String[] str1 = s1.split(" ",2);
String[] str2 = s2.split(" ",2);
// 식별자 뒤, 문자열이 숫자인지 문자인지 확인
boolean isDigit1 = Character.isDigit(str1[1].charAt(0));
boolean isDigit2 = Character.isDigit(str2[1].charAt(0));
// 둘다 문자임
if(!isDigit1 && !isDigit2)
// 데이터 값 비교 데이터가 같으면 식별자로 비교하고 데이터가 다르면 데이터로 비교한다.
return (str1[1].compareTo(str2[1])== 0) ? str1[0].compareTo(str2[0]) : str1[1].compareTo(str2[1]);
// 앞이 숫자, 오른쪽에 있어야 함으로 양수반환
else if(isDigit1 && !isDigit2) return 1;
// 앞이 문자, 왼쪽에 있어야 함으로 음수 반환
else if(!isDigit1 && isDigit2) return -1;
// 둘다 숫자면 그대로
return 0;
});
return logs;
}
2. Comparator의 sort 재정의
Arrays.sort(logs, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
//구현 같음
}
});
return logs;
- Comparator를 재정의하면 원하는 조건으로 정렬할 수 있다.
- 데이터를 식별자와 데이터값으로 나눈 뒤, 데이터 값이 숫자인지 문자인지 확인.
- 기준대로 조건문을 주어 각각 sort 해줌
'Algorithm > PTUStudy' 카테고리의 다른 글
2주차. 문자열 조작(가장 긴 팰린드롬 부분 문자열) (0) | 2023.01.16 |
---|---|
2주차. 문자열 조작(그룹 애너그램) (0) | 2023.01.16 |
2주차. 문자열 조작(가장 흔한 단어) (0) | 2023.01.16 |
1주차. 문자열 조작(문자열 뒤집기) (0) | 2023.01.16 |
1주차. 문자열 조작(유효한 팰린드롬) (0) | 2023.01.16 |