728x90


 

 

이 문제의 조건을 요약하자면

  1. 로그의 가장 앞 부부분은 식별자이다.
  2. 문자로 구성된 로그가 숫자 로그보다 앞에 온다.
  3. 식별자는 순서에 영향을 끼치지 않지만, 문자가 동일할 경우 식별자 순으로 한다.
  4. 숫자 로그는 입력 순서대로 한다.

 


 

📌 풀이

문제에서 문자로 구성된 로그가 숫자보다 앞에 온다 했으니 우선 문자로 구성된 로그와 숫자로 구성된 로그를 분리해서 

각 리스트에 저장하는 작업이 필요하다. (추후에 숫자로 구성된 로그는 + 를 이용해 이어 붙여 주기만 하면 된다.)

문자로 구성되있는지를 확인하기 위해 isdigit( )을 사용하여 준다.

 isdigit( )은 문자열이 숫자인지를 확인해서 boolean값을 return해주는 메소드이다.

 

letters, digits = [], []

for log in logs:
    if log.split()[1].isdigit(): # 로그의 식별자 뒤에 오는 것이 숫자인지 문자인지 확인
        digits.append(log) # 만약 식별자 뒤에 오는 것이 숫자라면 그 로그파일을 digits에 저장
    else:
        letters.append(log)# 숫자가 아니라면 letters에 저장

 

 

이렇게 문자로 구성된 로그와 숫자로 구성된 로그를 배분해주는 작업이 끝났다면 문제의 조건 중 3번째 조건을 충족시켜야 하는데

식별자를 제외한 문자열 [1:] ( [1] 이 아닌 [1:]임을 주의하자 뒤에 문자열이 몇개가 나올지 모른다.) 을 키로 하여 정렬하며,

동일한 경우 후순위로 식별자를 지정해주도록 하자.

 

 

이때 사용하는 것이 람다 표현식이다.

람다 표현식이란 쉽게 말해 식별자 없이 실행 가능한 함수를 말한다. 

함수 선언 없이도 하나의 식으로 함수를 단순하게 표현할 수 있다. 

 

 

만약 s가 ['2 A', '1 B', '4 C', '1 A'] 라고 해보자 

이때 그냥 sorted(s) 를 해주게 된다면 

['1 A', '1 B', '2 A', '4 C'] 으로 출력되게 된다.

하지만 우리가 원하는 것은 각 요소의 번호 순 정렬이 아닌 그 뒤 문자 순 정렬을 원하므로 

key를 이용한 람다식을 이용해주면 된다.

letters.sort(key = lambda x : (x.split()[1], x.split()[0]))

 

 

 

위의 예시에서는 뒤에 문자열이 하나밖에 없으므로 x.split()[1]을 해주었지만 문제에서는 뒤에 문자열이 몇개가 나올지 모르므로 슬라이싱[1:]을 해준다.

 

 

 

최종코드는 다음과 같다

class Solution:
    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 = sorted(letters, key = lambda x : (x.split()[1:], x.split()[0]))
        return letters + digits

 

 

 

 

 

 

 

 

복사했습니다!