github.com/onlybooks/algorithm-interview
1. 문제: 리트코드 937. Reorder Log Files
로그를 재 정렬하라. 기준은 다음과 같다.
1) 로그의 가장 앞부분은 식별자다.
2) 문자로 구성된 로그가 숫자 로그보다 앞에 온다.
3) 식별자는 순서에 영향을 끼치지 않지만, 문자가 동일할 경우 식별자 순으로 한다.
4) 숫자 로그는 입력 순서대로 한다.
2. 내 풀이
def reorderLogFiles(self, logs):
def compare_string_log(log1, log2):
log_len = max(len(log1), len(log2))
for i in range(log_len - 1):
#한 로그의 길이를 벗어나는 경우
if i >= len(log1) - 1:
return 1
elif i >= len(log2) - 1:
return -1
#뒷 문자열이 빠른 경우
if log1[i + 1] > log2[i + 1]:
return -1
#앞 문자열이 빠른 경우
elif log1[i + 1] < log2[i + 1]:
return 1
if log1[0] > log2[0]:
return -1
else:
return 1
#따옴표 안의 단어들 2차원 배열에 저장
new_logs = [[] for i in logs]
for i, log in enumerate(logs):
new_logs[i] = list(log.split(" "))
#숫자, 문자 로그 분리
number_logs = []
string_logs = []
for i, log in enumerate(new_logs):
if log[1].isdigit():
number_logs.append(log)
else:
string_logs.append(log)
#문자 로그 정렬
for i in range(len(string_logs)):
for j in range(len(string_logs) - 1):
#두 문자열 로그 비교
compare = compare_string_log(string_logs[j], string_logs[j+1])
if compare < 0:
temp = string_logs[j]
string_logs[j] = string_logs[j+1]
string_logs[j+1] = temp
#숫자, 문자 로그 합치기
final_logs = [' ' for i in range(len(string_logs) + len(number_logs))]
for i, string_log in enumerate(string_logs):
final_logs[i] = ' '.join(string_log)
for i, number_log in enumerate(number_logs):
final_logs[i + len(string_logs)] = ' '.join(number_log)
return final_logs
3. 모범 답안
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.sort(key=lambda x: (x.split()[1:], x.split()[0]))
return letters + digits
4. 배운 점
1) sort 함수 활용하기, 공백이 있는 문자열도 x.sort로 정렬할 수 있다.
2)lambda 활용하기, 복잡한 조건도 함수 선언할 필요 없이 적용 가능
'Computer Science > 알고리즘' 카테고리의 다른 글
[파이썬 알고리즘 인터뷰] 6. 두 수의 합 (0) | 2022.02.02 |
---|---|
[파이썬 알고리즘 인터뷰] 5. 가장 긴 팰린드롬 부분 문자열 (0) | 2022.02.02 |
[파이썬 알고리즘 인터뷰] 4. 그룹 애너그램 (0) | 2022.02.02 |
[파이썬 알고리즘 인터뷰] 3. 가장 흔한 단어 (0) | 2022.01.31 |
[파이썬 알고리즘 인터뷰] 2. 문자열 뒤집기 (0) | 2022.01.31 |