728x90
반응형
로그를 재정렬하라.
1. 로그의 가장 앞 부분은 식별자다.
2. 문자로 구성된 로그가 숫자 로그보다 앞에 온다.
3. 식별자는 순서에 영향을 끼치지 않지만, 문자가 동일한 경우 식별자 순으로 한다.
4. 숫자 로그는 입력 순서대로 한다.
예제
# 입력
logs = ["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"]
개인 풀이
# 실패 ================================================
intLog = list()
strLog = list()
# 1. 숫자와 문자 구분
for i in logs:
log = i.split()
if log[1].isnumeric():
intLog.append(i)
else:
strLog.append(i)
i = 0
intLen = len(intLog)
# 2. 숫자 정렬
while i < intLen - 1:
temp = ''
nowLog = intLog[i].split()[1]
nextLog = intLog[i + 1].split()[1]
if nowLog > nextLog:
temp = intLog[i]
intLog[i] = intLog[i + 1]
intLog[i + 1] = temp
i += 1
# 값이 여러개라면 여러번 돌려야 하는데 뭔가 비효율적이라고 느껴서 다른 방법을 찾아봄
풀이1. 람다와 연산자 사용
- 내가 사용하던 방식과 혼합
intLog = list()
strLog = list()
# 숫자, 문자 구분
for i in logs:
log = i.split()
if log[1].isnumeric():
intLog.append(i)
else:
strLog.append(i)
# 정렬
sortedInt = sorted(intLog, key=lambda x: (x.split()[1], x.split()[0]))
sortedStr = sorted(strLog, key=lambda x: (x.split()[1], x.split()[0]))
# 리스트 합치기
result = sortedStr + sortedInt
print(result)
['let1 art can', 'let3 art zero', 'let2 own kit dig', 'dig2 3 6', 'dig1 8 1 5 1']
- 풀이 답안
def reorderLogFiles(logs: List[str]):
letters, digits = [], []
for log in logs:
if log.split()[1].isdigit():
digits.append(log)
else:
letters.append(log)
# 2개의 키를 람다 표현식으로 정렬
letters.sort(key=lambda x: (x.split()[1:], x.split()[0]))
digits.sort(key=lambda x: (x.split()[1:], x.split()[0]))
return letters + digits
reorderedLogs = reorderLogFiles(logs)
print(reorderedLogs)
===== 풀이1. 람다와 연산자 ======================
['let1 art can', 'let3 art zero', 'let2 own kit dig', 'dig2 3 6', 'dig1 8 1 5 1']
728x90
반응형
'Algorithm > Python' 카테고리의 다른 글
[6.문자열조작]문자열 뒤집기 (0) | 2022.05.16 |
---|---|
[6.문자열조작]유효한 팰린드롬 (0) | 2022.05.16 |