본문 바로가기

알고리즘과 자료구조/OJ

LeetCode 937. Reorder Data in Log Files(Lamda식을 이용한 sort)

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

파이썬 알고리즘 인터뷰