이 문제의 조건을 요약하자면
- 로그의 가장 앞 부부분은 식별자이다.
- 문자로 구성된 로그가 숫자 로그보다 앞에 온다.
- 식별자는 순서에 영향을 끼치지 않지만, 문자가 동일할 경우 식별자 순으로 한다.
- 숫자 로그는 입력 순서대로 한다.
📌 풀이
문제에서 문자로 구성된 로그가 숫자보다 앞에 온다 했으니 우선 문자로 구성된 로그와 숫자로 구성된 로그를 분리해서
각 리스트에 저장하는 작업이 필요하다. (추후에 숫자로 구성된 로그는 + 를 이용해 이어 붙여 주기만 하면 된다.)
문자로 구성되있는지를 확인하기 위해 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
'Algorithm' 카테고리의 다른 글
백준 알고리즘 파이썬(Python) 6603번 로또 (0) | 2021.09.05 |
---|---|
백준 알고리즘 파이썬(Python) 10819번 차이를 최대로 (0) | 2021.09.05 |
리트코드(LeetCode) 125번 Valid Palindrome (유효한 팬린드롬) (0) | 2021.08.31 |
백준 알고리즘 파이썬(Python) 14501번 퇴사 (0) | 2021.08.30 |
백준 알고리즘 파이썬(Python) 10972번 다음 순열 (0) | 2021.08.25 |