📍 로그파일 재정렬
로그를 재정렬 하라. 기준은 다음과 같다.
- 로그의 가장 앞 부분은 식별자다.
- The letter-logs come before all digit-logs.(문자로 구성된 로그가 숫자 로그보다 앞에 온다. )
- The letter-logs are sorted lexicographically by their contents. If their contents are the same, then sort them lexicographically by their identifiers.(식별자는 순서에 영향을 끼치지 않지만, 문자가 동일할 경우 식별자 순으로 한다.)
- 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"]
어떤 조건때문에 오답판정을 받았는지 알아차렸다면 이 문제를 완벽하게 이해했다고 볼 수 있다.
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
'Python > 파이썬을 알고리즘 인터뷰' 카테고리의 다른 글
[ 7. 배열 ] - 두 수의 합(Two Sum) (0) | 2021.04.08 |
---|---|
[ 6. 문자열 조작 ] - 그룹 애너그램(Group Anagrams) (0) | 2021.04.06 |
[ 6. 문자열 조작 ] - 가장 흔한 단어(Most Common Word) (0) | 2021.04.04 |
[ 6. 문자열 조작 ] - 문자열 뒤집기(Reverse String) (0) | 2021.04.02 |
[ 6. 문자열 조작 ] - 문자열 슬라이싱(String Slicing) (0) | 2021.04.02 |
댓글