파이썬을 이용한 알고리즘 공부 내용을 정리합니다.
로그를 재정렬하라. 기준은 다음과 같다.
- 각 로그는 공백으로 구분된 단어 문자열이며 첫 번째 단어는 식별자 입니다.
- 두 가지 유형의 로그가 있습니다.
Letter-logs : 모든 단어(식별자 제외)는 영문 소문자로 구성됩니다.
Digit-logs : 모든 단어(식별자 제외)는 숫자로 구성됩니다.
다음과 같이 로그를 재정렬합니다.
- Letter-logs는 Digit-logs보다 앞에 온다.
- 식별자는 순서에 영향을 끼치지 않지만, 문자가 동일한 경우 식별자 순으로 한다.
- Digit-logs는 입력순서대로 한다.
예시1
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"]
예시2
Input: logs = ["a1 9 2 3 1","g1 act car","zo4 4 7","ab1 off key dog","a8 act zoo"]
Output: ["g1 act car","a8 act zoo","ab1 off key dog","a1 9 2 3 1","zo4 4 7"]
def reorderLogFiles(self, logs: List[str]) -> List[str]:
letters, digits = [], [] #문자로그, 숫자로그를 저장할 리스트를 선언해준다.
for log in logs:
if log.split()[1].isdigit(): #속성을 split하여 식별자를 제외한 후 문자인지 숫자인지 판별
digits.append(log) #숫자라면 digit리스트에 추가
else:
letters.append(log) #문자라면 letters리스트에 추가
#letters를 람다식을 사용해 기준대로 정렬한다.
letters.sort(key=lambda x: (x.split()[1:], x.split()[0])) #letters의 각 속성에서 식별자를 제외한 내용들을 오름차순으로 정렬하고, 내용이 같을경우 후순위로 식별자에 따라 정렬한다.
return letters + digits #+를 이용해 두 리스트를 합쳐준다.
람다는 편리하고 있어보이지만 코드가 길어지고 map이나 filter와 함께 사용하면 가독성이 떨어지니 주의가 필요하다.
리스트 컴프리헨션을 사용도록 하자.