코드노트

leetcode 937. Reorder Data in Log Files 로그 파일 재정렬, JS, python 본문

Code note/자바스크립트 알고리즘 문제풀이

leetcode 937. Reorder Data in Log Files 로그 파일 재정렬, JS, python

코드노트 2024. 1. 5. 17:13
더보기

You are given an array of logs. Each log is a space-delimited string of words, where the first word is the identifier. There are two types of logs: Letter-logs: All words (except the identifier) consist of lowercase English letters. Digit-logs: All words (except the identifier) consist of digits. Reorder these logs so that: The letter-logs come before all digit-logs. The letter-logs are sorted lexicographically by their contents. If their contents are the same, then sort them lexicographically by their identifiers. The digit-logs maintain their relative ordering. Return the final order of the logs.

 

여러분에게는 로그 배열이 주어집니다.

각 로그는 첫 번째 단어가 식별자인 공백으로 구분된 단어 문자열입니다.

두 가지 유형의 로그가 있습니다:

편지-로그: 모든 단어( 식별자를 제외한)는 소문자 영어 문자로 구성됩니다.

숫자-로그: 모든 단어( 식별자를 제외한)는 숫자로 구성됩니다.

이렇게 하려면 로그의 순서를 바꾸세요: 편지-로그가 모든 숫자-로그 앞에 옵니다.

편지-로그는 내용물에 따라 사전순으로 정렬됩니다.

내용물이 같으면, 식별자에 따라 사전순으로 정렬합니다. 숫자-로그는 상대적인 순서를 유지합니다.

로그의 마지막 순서를 반환합니다.

 

 

Input: logs = ["dig1 8 1 5 1","let1 art can","dig2 3 6","let2 own kit dig","let3 art zero"]
Output: ["let1 art can","let3 art zero","let2 own kit dig","dig1 8 1 5 1","dig2 3 6"]

문제 설명

- 로그의 가장 앞 부분은 식별자

- 문자로 구성된 로그가 숫자 로그보다 앞에 온다.

- 식별자는 순서에 영향을 끼치치 않는다.

- 문자가 동일한 경우 식별자 순으로 한다.

- 숫자 로그는 입력 순서대로 한다.

 

 

python

class Solution(object):
    def reorderLogFiles(self, logs):
        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

- letters, digits 리스트를 만들어준다.

- 문자로그와 숫자로그를 나누기위해 isdigit을 사용해서 숫자인지 문자인지 확인한 후 letters, digits에 각각 넣어준다.

- letters를 lambda함수를 사용하여 정렬을 해주었다. 들어오는 값을 split로 분할한 후 두번째 요소부터 끝까지 기준으로 정렬한다.

- 그리고 각 요소를 공백기준으로 분할하여 첫번째 요소를 선택하여 두번째 기준으로 정렬한다.

- 첫번째 기준은 앞 단어로 확인하고 그 뒤로 뒷단어들도 확인할 수 있도록 하였다.

 

javascript

var reorderLogFiles = function(logs) {
    const letters = [];
    const digits = [];

    logs.forEach(item => isNaN(item.split(" ")[1]) ? letters.push(item) : digits.push(item))

    letters.sort((a, b) => {
        const aSubstring = a.split(" ").slice(1).join(" ");
        const bSubstring = b.split(" ").slice(1).join(" ");
        if(aSubstring !== bSubstring) return aSubstring.localeCompare(bSubstring)

        return a.split(" ")[0].localeCompare(b.split(" ")[0])
    })
    return [...letters, ...digits]
};

- 자바스크립트도 파이썬으로 푼 문제를 토대로 먼저 숫자인지 isNaN을 사용하여 문자, 숫자 로그를 나누었다.

- sort를 통해서 할 수 있지만 확실히 파이썬과는 다르게 직접적으로 정렬할 기준들을 명시해주어야한다.

- slice를 사용해서 로그 뒤에 오는 문자 단어들을 비교해보고 localeCompare를 통해서 문자열의 순서를 정렬했다.