문제
로그를 재정렬하라. 기준은 다음과 같다
1. 로그의 가장 앞 부분은 식별자다.
2. 문자로 구성된 로그가 숫자 로그보다 앞에 온다.
3. 식별자는 순서에 영향을 끼치지 않지만, 문자가 동일할 경우 식별자 순으로 한다.
4. 숫자 로그는 입력 순서대로 한다.
예제 1
입력
["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와 + 연산자를 사용해 구현해보도록 하겠습니다.(feat. isdigit())
풀이
문자로 구성된 로그가 숫자로 구성된 로그보다 앞에 오고, 식별자는 순서에 영향을 미치지 않으므로, split() 함수를 사용하여 문자열을 식별자와 이외 문자로 분리해보겠습니다. 그 다음 식별자가 아닌 인덱스가 1인 문자가 숫자인지 확인하는 isdigit() 함수를 사용하여, 숫자면 digits 배열에, 문자면 letters 배열에 추가합니다.
# 함수 내부
letters, digits = [], []
for log in logs:
if log.split()[1].isdigit():
digits.append(log)
else:
letters.append(log)
이제 조건 3번에 맞게 letters 배열을 정렬해야합니다. 이때 람다 표현식을 사용하여 코드를 작성해보도록 하겠습니다.
추후 함수가 정렬된 letters와 digits을 합친 문자열 배열을 반환해야 하므로, 정렬된 결과만을 반환하고 원형을 변형시키는 sorted가 아닌 실제 원형을 정렬하는 sort를 사용합니다.
# 함수 내부
letters.sort(key=lambda x: (x.split()[1:], x.split()[0]))
return letters + digits
2개의 키를 람다 표현식으로 정렬하는 문법을 사용해서 구현한 코드입니다. 따로 함수를 새로 선언하지 않고도 쉽게 처리할 수 있었습니다.
그러나 map이나 filter를 함께 섞어서 사용하기 시작하면 가독성이 떨어질 수 있으므로 주의를 요합니다.
출처
도서: 파이썬 알고리즘 인터뷰
'Computer Science > 알고리즘 - 문자열 처리' 카테고리의 다른 글
문자열에서 가장 흔한 단어(리스트 컴프리헨션, Counter 객체) (0) | 2023.01.21 |
---|---|
문자열 뒤집기(reverse, Slicing) (0) | 2023.01.16 |
팰린드롬 구별(Deque, Slicing) (0) | 2023.01.16 |