로그를 재정렬하라. 기준은 다음과 같다.
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
알파벳인지 확인하기(isalpha)
숫자인지 확인하기(isdigit)
알파벳 또는 숫자인지 확인하기(isalnum)
- 정렬된 새로운 리스트를 반환한다.
- 원본 리스트에는 영향이 가지 않는다
- 리스트, 튜플, 딕셔너리, 문자열 등 모든 iterable에 동작한다.
리트코드 49. 그룹 애너그램 (파이썬) (0) | 2021.09.10 |
---|---|
리트코드 819. 가장 흔한 단어 (파이썬) - ✍️2차 할 차례 (0) | 2021.09.08 |
리트코드 344. 문자열 뒤집기 (파이썬) (0) | 2021.09.02 |
리트코드 125. 유효한 팰린드롬 (파이썬) (0) | 2021.09.02 |