본문 바로가기

Computer Science/알고리즘

[파이썬 알고리즘 인터뷰] 1. 로그 파일 재정렬

github.com/onlybooks/algorithm-interview

 

GitHub - onlybooks/algorithm-interview: <파이썬 알고리즘 인터뷰> 95가지 알고리즘 문제 풀이로 완성하는

<파이썬 알고리즘 인터뷰> 95가지 알고리즘 문제 풀이로 완성하는 코딩 테스트. Contribute to onlybooks/algorithm-interview development by creating an account on GitHub.

github.com

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 활용하기, 복잡한 조건도 함수 선언할 필요 없이 적용 가능