상세 컨텐츠

본문 제목

리트코드 937. 로그파일 재정렬 (파이썬)

알고리즘/문자열 조작

by NayC 2021. 9. 2. 20:36

본문

728x90

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

1. 로그의 가장 앞 부분은 식별자다.

2. 문자로 구성된 로그가 숫자 로그보다 앞에 온다.

3. 식별자는 순서에 영향을 끼치지 않지만, 문자가 동일할 경우 식별자 순으로 한다.

4. 숫자 로그는 입력 순서대로 한다. 

 

Example 1:Input: logs = ["dig1 8 1 5 1","let1 art can","dig2 3 6","let2 own kit dig","let3 art zero"] Output: ["let1 art can","let3 art zero","let2 own kit dig","dig1 8 1 5 1","dig2 3 6"] Explanation: The letter-log contents are all different, so their ordering is "art can", "art zero", "own kit dig". The digit-logs have a relative order of "dig1 8 1 5 1", "dig2 3 6".

 

Example 2:

Input: logs = ["a1 9 2 3 1","g1 act car","zo4 4 7","ab1 off key dog","a8 act zoo"] Output: ["g1 act car","a8 act zoo","ab1 off key dog","a1 9 2 3 1","zo4 4 7"]


2차

하나하나 읽으면서, '조건'에 따라서  

한글 리스트 = []

숫자 리스트 = [] 에 넣어준다는 생각을 하는게 key

 

1. '기준'은 다 사용하는게 맞는데 우선 순위를 세워보자.

for i in logs 

(1) 우선 식별자와 로그를 구분짓기

     a = i.split() 

     식별자 :  a[0]

     로그 : a[1]

(2) if a[1] = 문자(a-z)

          한글 리스트.append(i)

      else:       

          숫자 리스트.append(i)

(3) 3,4 번 조건은 사실상 없는거나 마찬가지.

      -> 리스트끼리는 더할 수 있으니 '한글 리스트 + 숫자리스트'하면 됨

           3번은 정렬해줘야함. 람다 사용

 

 

1차

[접근 고민] 30분 하자. 9시 35분까지. 10분 추가 45분까지. 10분 추가 55분까지. 시간 제한 해제 - 생각해보자...! 

- 이건 문제 이해부터 필요하다. 

- > 이해 완료 

 

- 우선 logs가 리스트. 리스트 안의 것들을 '정렬' 한다. 

  -> 새로운 리스트를 하나 만들고, 차례대로 append() 하는 식으로 접근해볼까.

- 먼저 리스트 안의 것들을 하나씩 읽어야 해.

    for i in list

- 그리고 식별자 + 로그들로 나눠줘야해

  식별자가 다 앞에 4글자니까 이거로 기준 삼아줘도 될 듯 (공백은... 뒤에 로그에서 많다.)

  -> 슬라이싱은 리스트와 문자열에서 다 쓸 수 있다고 했어. 

       i[:4] 가 앞 부분 + 뒤에는 i[5:] 

- 그리고 뒤에 부분을 새로운 변수에 담아서 index로 읽어줄 수 있으려나? -> 뒤에 로그가 문자인지, 숫자인지 나눠줘야 하니.

  -> t로 담을 수 있다고 가정하면

       if type(t[0]) == str: 

 

문제 상황.

- [] 만들고, 하나씩 다 비교해서 1등, 2등, 3등... 넣어주려는건데 

  그래서 1등은 어떤 기준인건지를 보면 (이거부터 확실히 정하고 위에도 진행했었어야 했당)

  (1) if type(t[0]) == str:  인거

  (2) * 여기서 문제임

  -> 5개의 타입이 뭔지를 알고, '3글자'의 문자 로그가 '같으면' (3) 앞의 식별자 i[:4] '순서대로' 넣어준다는게... 차례대로 읽는걸 억지로(?) 조건들에 걸리게 해서 1,2,3... 등 만들고 넣어주려는건데... // 

-> 1) 확-실하게 1,23,...등 정해서 순서대로 넣어주거나 2) 비교해서 앞 뒤로 (pop하고 또 다른거) 넣어주고, 그 안에서 또 '자리 바꿔주거나' - 여기서 자리를 어떻게 바꾸지?? 

 

힌트 

- lamda를 사용한대. 


[코드 짜기]


[올바른 코드를 확인해보자]

 

* 내가 생각하지 못했던 부분 * 

-> 문자열 리스트, 숫자 리스트 이렇게 빈 리스트를 2개 만들어서 넣어줬으면 되었음

- 그리고 두 개 리스트 변수를 그냥 더하면 되었음 (이게 '각각' 순서대로 정렬되는 방법) 

 

- 람다식은.... 아예 몰랐으니 생각 못할법도 했다. (후순위 비교 기능 이런걸 아예 알지 못했으니)

 

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에 모두 모였으므로 다음과 같이 정렬하면 됨

    letters.sort(key=lambda x:(x.split()[1], x.split()[0]))
    return letters + digits

 

리스트안에 튜플의 1번인덱스 값의 크기를 먼저비교하고 0번인덱스를 후순위로 비교해서 정렬하라는 람다식을 받고 있는것

 

cf) 람다식 연습

s = ['2a', '1b', '4c', '1a']

    #함수식
    def func(x):
        return x.split()[1], x.split()[0]
    
    s.sort(key=func)

    #람다식
    s.sort(key=lambda x: (x.split()[1], x.split()[0]))

 


cf)

https://dojang.io/mod/page/view.php?id=2359 

 

파이썬 코딩 도장: 32.1 람다 표현식으로 함수 만들기

Unit 32. 람다 표현식 사용하기 지금까지 def로 함수를 정의해서 사용했습니다. 이번에는 람다 표현식으로 익명 함수를 만드는 방법을 알아보겠습니다. 람다 표현식은 식 형태로 되어 있다고 해서

dojang.io

 


알파벳인지 확인하기(isalpha) 

숫자인지 확인하기(isdigit)

알파벳 또는 숫자인지 확인하기(isalnum) 


https://wikidocs.net/16041


  • sort의 경우 list.sort() 를 사용 : 원본 리스트 자체의 순서를 변경

 

  • sorted의 경우 sorted(list) 를 사용

- 정렬된 새로운 리스트를 반환한다.

- 원본 리스트에는 영향이 가지 않는다

- 리스트, 튜플, 딕셔너리, 문자열 등 모든 iterable에 동작한다.

 

https://velog.io/@htchoi1006/%ED%8C%8C%EC%9D%B4%EC%8D%AC-sort%EC%99%80-sorted%EC%9D%98-%EC%B0%A8%EC%9D%B4


 

 

728x90
반응형

관련글 더보기