문자열 조작_3. Reorder Data in Log Files

leetcode 937. Reorder Data in Log Files

문제

로그를 재정렬하라. 기준은 다음과 같다.
1. 로그의 가장 앞 부분은 식별자.
2. 문자로 구성된 로그가 숫자 로그보다 앞에 온다.
3. 문자가 동일한 경우는 식별자 순으로 한다.
4. 숫자 로그는 입력 순서대로 한다.

입출력예시

  • 입력: log = ["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"]

풀이

먼저 문자와 숫자를 구분한 뒤 문자 로그를 람다 표현식(Lambda Expression)을 이용해 정리한 후 숫자를 나중에 그대로 이어붙인다.

파이썬

def reorderLogFiles(self, logs: List[str]) -> List[str]:
    letters, digits = [], []
    for log in logs:
        if log.split()[1].isdigit():
            digits.append(log)
        else:
            letters.append(log)
    letters.sort(key=lambda x: (x.split()[1:], x.split()[0]))
    return letters + digits
  • runtime: 40 ms
  • memory: 14.4 MB

자바스크립트

const reorderLogFiles = (logs) => {
  const digitLogs = [];
  const letterLogs = [];
  const body = s => s.slice(s.indexOf(' ') + 1); // get the body after identifier
  const isNum = c => /\d/.test(c);

  // if body same then compare identifier
  const compare = (a, b) => {
    const n = body(a).localeCompare(body(b));
    if (n !== 0) return n;
    return a.localeCompare(b);
  };
  
  for (const log of logs) {
    if (isNum(body(log))) digitLogs.push(log);
    else letterLogs.push(log);
  }
  return [...letterLogs.sort(compare), ...digitLogs];
};
  • runtime: 84 ms
  • memory: 43.2 MB

참고
파이썬 알고리즘 인터뷰

좋은 웹페이지 즐겨찾기