Problem
identifier와 log를 포함한 문자열들 안에서 logs를 기준으로 정렬하는 문제였다. 처음에 identifier를 value로 하고 logs를 key로 한 HashMap을 이용해서 풀려고 했지만, log가 동일한 경우에 HashMap의 keySet(중복 허용x)의 문제 때문에 막혔다. 해쉬맵의 키가 Set이라는 것과 log가 같은 경우를 맞물려 생각 못 했다.
class Solution {
public String[] reorderLogFiles(String[] logs) {
ArrayList<String> l = new ArrayList<>(); // letters
ArrayList<String> d = new ArrayList<>(); // digits
String[] res = new String[logs.length];
int i=0;
for(String s : logs){ // for(int i=0;i<logs.length;i++) => took more memory and time than this forEach
int idx = s.indexOf(" ")+1; // split을 이용하는 경우도 있지만, indexOf가 더 빠를 것 같았다.
char c = s.charAt(idx);
if(Character.isDigit(c)) d.add(s);
else l.add(s);
}
Collections.sort(l,
(x,y)->{
String str1 = x.substring(x.indexOf(" ")+1);
String str2 = y.substring(y.indexOf(" ")+1);
return str1.equals(str2)?x.compareTo(y):str1.compareTo(str2);
});
for(i=0;i<l.size();i++) // l.addAll(d), l.toArray(String[0]) 보다 시간 절약됨
res[i]=l.get(i);
for(;i<logs.length;i++)
res[i]=d.get(i-l.size());
return res;
}
}
Reference
파이썬 알고리즘 인터뷰
'알고리즘과 자료구조 > OJ' 카테고리의 다른 글
LeetCode 49. Group Anagrams (0) | 2021.09.18 |
---|---|
LeetCode 819. Most Common Word(StringBuilder 이용) (0) | 2021.09.12 |
Leetcode 344. Reverse String (0) | 2021.08.30 |
LeetCode 125. Valid Palindrome, java (0) | 2021.08.29 |