로그 파일 재정렬

채영민·2024년 3월 18일
0

데이터 구조_파이썬

목록 보기
18/25
post-custom-banner

📚 로그 파일 재정렬 문제

💡 로그를 재정렬하라. 기준은 다음과 같다.

  • 규칙
  1. 로그의 가장 앞 부분은 식별자다.
  2. 문자로 구성된 로그가 숫자 로그보다 앞에 온다.
  3. 식별자는 순서에 영향을 끼치지 않지만, 문자가 동일할 경우 식별자 순으로 한다.
  4. 숫자 로그는 입력 순서대로 한다
  • 입력 : logs = ["dig1 8 1 5 1", "let1 art can", "dig2 3 6", "let2 own kit dig", "let3 art zero"]

📚 로그 파일 재정렬 문제풀이

💡 풀이 : 람다와 + 연산자를 이용

🗣️ isdigit()은 해당 문자열이 숫자 인지 여부를 판별해 준다.

🗣️ + 연산자는 배열을 합쳐준다.

a = [1,2,3]
b = [4,5,6]

print(a + b) // [1,2,3,4,5,6]
print(b + a) // [4,5,6,1,2,3]
import sys

logs = deque(sys.stdin.readline().strip().split(','))

def sort_func(logs: list[str]) -> list[str]:
    digits = []
    letters = []
       
    for i in logs :
        if i.split()[1].isdigit() :
            digits.append(i)
        else :
            letters.append(i)    
   
    letters.sort(key = lambda x : (x.split()[1:], x.split()[0]))
           
    return letters + digits
           
print(sort_func(logs))
  • 여기서 split(), isdigit() 함수를 이용해 해당 문자열이 문자로그인지 숫자로그인지 파악한다.
  • 위에서 반복문을 통하면 숫자 로그는 digits배열에, 문자 로그는 letters배열에 추가 된다.
  • 이제 letters.sort(key = lambda x : (x.split()[1:], x.split()[0])) 이렇게 정렬해 주면 된다.

🗣️ letters.sort(key = lambda x : (x.split()[1:], x.split()[0])) 는 식별자를 제외한 문자열 [1:]을 키로하여 정렬하되, 동일한 경우 후순위로 식별자 [0]을 지정해 정렬하도록 람다 표현식을 이용해 정렬.

📚 결론

  • 람다 표현식은 함수 구문을 한 문장으로 표현할 수 있지만, map, filter등과 섞어서 사용하기 시작하면 가독성이 떨어질 수 있다.

(참고) 📚 람다 표현식

  • 람다 표현식이란, 식별자 없이 실행 가능한 함수를 말하며, 함수 선언 없이도 하나의 식으로 함수를 단순하게 표현할 수 있다.

  • 만약, 각 요소의 번호 순 정렬이 아닌 그 뒤의 문자 순 정렬을 원하며, 문자가 동일한 경우에만 그 앞 번호순으로 정렬되는 형태를 희망햘 경우?

    s = ['2 A','1 B','4 C','1 A']
    sorted(s) // ['1 A','1 B','2 A','4 C']
    // sorted는 숫자 그리고 문자순으로 정렬함
    
    def sorted_func(x) :
    	return x.split()[1], x.split()[0]
    	// ['1 A','2 A','1 B','4 C']
  • 여기서 람다 표현식을 사용하면 sorted_func처럼 별도의 함수를 선언하지 않고 쉽게 처리할 수 있다.

    s.sort(key=lambda x : (x.split()[1], x.split()[0]))
    // ['1 A','2 A','1 B','4 C']
profile
시각적인 코딩을 즐기는 개발자 지망생 채영민 입니다;
post-custom-banner

0개의 댓글