본문 바로가기
Python/파이썬을 알고리즘 인터뷰

[ 6. 문자열 조작 ] - 로그파일 재정렬 (Reorder Log Files)

by YWTechIT 2021. 4. 6.
728x90

📍 로그파일 재정렬

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

  1. 로그의 가장 앞 부분은 식별자다.
  2. The letter-logs come before all digit-logs.(문자로 구성된 로그가 숫자 로그보다 앞에 온다. )
  3. The letter-logs are sorted lexicographically by their contents. If their contents are the same, then sort them lexicographically by their identifiers.(식별자는 순서에 영향을 끼치지 않지만, 문자가 동일할 경우 식별자 순으로 한다.)
  4. The digit-logs maintain their relative ordering.(숫자 로그는 입력 순서대로 한다.)

⚡️ 나의 풀이

문제를 잘 보면 우선순위가 정해져있음을 알 수 있다.


s="dig1 8 1 5 1"일 때 식별자는 dig1이고 나머지 내용은 8 1 5 1이 해당된다.
식별자를 제외한 나머지 값들을 먼저 정렬하고 정렬이후에도 값이 같다면 식별자를 정렬해주면 된다.

 

문자로그가 숫자로그보다 앞에 온다는 것으로 보아 입력에서 식별자 다음 값이 문자인지, 숫자인지 확인하고 letters, digits 배열에 넣어줬다.

 

처음에는 if i[5].isdigit()라고 작성해서 제출했는데 식별자가 꼭 4글자로 정해진것이 아니기 때문에 i[5]로 하면안되고 split()[1]로 해야한다.

 

이후 letters값을 정렬할때 람다함수를 사용해서 기준을 2개로 정할 수 있었는데, 처음 key=lambda x: (x.split()[1], x.split()[0]))로 작성했다. 이 코드는 오답 판정을 받았는데 왜 그런지 다음 테스트케이스를 보자.

# 오답
wrong: ["a8 act zoo", "g1 act car", "ab1 off key dog", "a1 9 2 3 1", "zo4 4 7"]

# 정답
answer: ["g1 act car","a8 act zoo","ab1 off key dog","a1 9 2 3 1","zo4 4 7"]

 

728x90

어떤 조건때문에 오답판정을 받았는지 알아차렸다면 이 문제를 완벽하게 이해했다고 볼 수 있다.

 

g1 act car, a8 act zoo을 보면 알 수 있는데, key=lambda x: (x.split()[1], x.split()[0])) 로 작성했을 때 split()[1]값(act)만 비교하고 바로 식별자를 비교한것을 알 수 있다.

 

따라서 split()[1:]로 작성해야 문장 끝까지 비교 이후에 식별자를 비교하는것을 테스트케이스를 통해 알 수 있었다.

작성한 코드는 다음과 같다. leet code에 제출했던 코드기때문에 class를 빼고 def부분만 사용하면 된다. 책을 풀면서 leet code에 처음 접해봤는데 문제가 영어라서 조금 생소(?)했었다.

 

문제가 한글로 나오면 좋으련만.. 그래도 타 알고리즘 사이트와는 다르게 오답판정을 받으면 어떤 테스트케이스에서 잘못됐는지 알려주기때문에 푸는 입장에서 많은 도움이 되는것같다.

 

또, 정답을 제출하면 Submission Detail로 나의 코드 실행시간, 메모리사용량이 타 코드들에 비해 얼마나 빠른지 / 느린지 객관적으로 알 수 있어 체계적으로 잘 만든 사이트라는 느낌을 받았다.

class Solution:
    def reorderLogFiles(self, logs: List[str]) -> List[str]:
        letters, digits = [], []

        # 식별자 다음 값을 letters, digits 판별
        for i in logs:
            if i.split()[1].isdigit():
                digits.append(i)
            else:
                letters.append(i)

        letters = sorted(letters, key=lambda x: (x.split()[1:], x.split()[0]))
        return letters + digits
반응형

댓글