swift 리트코드 문제풀이 - leetcode 937 로그 파일 재정렬
문제 leetcode 937 - Reorder Data in Log Files
로그를 재정렬하라. 기준은 다음과 같다.
-로그의 가장 앞 부분은 식별자이다.
-문자로 구성된 로그가 숫자 로그보다 앞에 온다.
-식별자는 순서에 영향을 끼치지 않지만, 문자가 동일한 경우 식별자 순으로 한다.
-숫자 로그는 입력 순서대로 한다.
-문자 로그는 사전 순으로 정렬한다.
예제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"]
예제 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"]
이 문제는 와ㅣ...
이해하는데만 엄청 오래 걸렸다... 문제를 풀다가 포기할까 생각도함.. 실제로 나같은 사람이 많은지 리트코드 해당 페이지에 비추천이 너무 많음ㅋㅋㅋ
문제 풀이를 해보자면 로그의 가장 앞부분은 식별자다 조건은 문자열을 " " 기준으로 나누어 배열로 만든다음 배열의 0번째 요소를 제외한 나머지 요소들이 로그라는 말이다. 즉 배열의 0번째와 배열의 0번째를 제외한 요소들로 구분지으면 생각하기도 편하고 작업하기도 편함
문자로 구성된 로그가 숫자 로그보다 앞에 온다.
이 조건도 배열안 문자열을 배열로 만든다음 0번째를 제외한 요소들을 가지고 서로 비교하면 된다.
숫자로그는 입력순서대로
일단 숫자로그만 따로 모아 놓았다가 문자로그 정렬이 끝나면 그 뒤에 붙여주기만 하면 끝난다.
식별자는 순서에 영향을 끼치지 않지만, 문자가 동일한 경우 식별자 순으로 한다.
문자 로그는 사전 순으로 정렬한다.
이 두조건은 같이 보면 좋다. 즉 하나로 합치면 문자로그는 사전 순으로 정렬하고 문자가 서로 같으면 식별자 순서로 정렬해라 라는 말이다.
상당히 조건이 많아서 좀 까다롭다;;;;
일단 1단계 2단계로 나눠서 처리 해보자
var logArray = ["dig1 8 1 5 1","let1 art can","dig2 3 6","let2 own kit dig","let3 art zero"]
func reorderLogFiles(_ logs: [String]) -> [String] {
//1.
var resultStr : [String] = []
var strLog : [String] = []
var intLog : [String] = []
//문자로그, 숫자로그 분리
for log in logs{
//배열 두번째 요소 체크 - true : 문자 , false : 숫자
let isText = log.split(separator: " ")[1].filter({ $0.isNumber }).count == 0
isText ? strLog.append(log) : intLog.append(log)
}
//2.
strLog = strLog.sorted(by: ward)
resultStr += strLog
resultStr += intLog
return resultStr
}
먼저 //1. 부분을 보면 (//2.번은 아직.)
빈 배열들을 여러개 할당했다. 일단 입력받은 배열안의 로그들을 솎아(?) 내야 한다. 이 로그가 숫자로그인지, 문자로그인지 구별해야 한다.
배열의 요소들을 보면 " " 이런식으로 한칸씩 띄워져있다. 이 요소들을 " " 기준으로 배열을 만든 다음 배열의 1 번째 index에 위치한 요소가 숫자인지 문자인지 체크하면 된다.
즉 //1. 번 부분은 문자로그 , 숫자로그 분리하는 처리다.
문자, 숫자 로그 분리가 끝났으면 문자로그 배열을 다시 정렬해야 한다. 어떻게? 알파벳 순으로! 만약 로그가 같으면? 식별자 순으로! 이 처리를 담당하는 함수를 하나 만들어 주자.
//로그를 오름차순으로 처리
func ward(_ s1: String, _ s2: String) -> Bool {
var first = s1.split(separator: " ")
var second = s2.split(separator: " ")
first.removeFirst()
second.removeFirst()
let f = first.joined(separator: " ")
let s = second.joined(separator: " ")
// 문자열이 같으면 식별자 비교
if (f.elementsEqual(s)){
let first = s1.split(separator: " ")
let second = s2.split(separator: " ")
return first[0] < second[0]
}
return f < s
}
//1. 에서 분리한 문자 로그를 ward 함수를 이용해서 오름차순으로 정렬해준다. 함수이름이 ward?.... 쓰고보니 이상하네.. 암튼.... ....
swift는 문자배열.sorted(ward) 이런식으로 정렬함수를 사용할 수 있다.
위 함수에서 주의 할 점은 만약 문자 로그가 같으면!이라는 부분인데 이때는 식별자를 비교해야 한다. 식별자는 0번째 index에 있기 때문에 0번째 index의 문자를 기준으로 오름차순으로 정렬해주면 끝!
'자료구조&알고리즘 > leetcode 풀이' 카테고리의 다른 글
swift 리트코드 문제풀이 - leetcode 1 두 수의합 (0) | 2022.07.26 |
---|---|
swift 리트코드 문제풀이 - leetcode 49 그룹 애너그램 (0) | 2022.07.24 |
swift 리트코드 문제풀이 - leetcode 819 가장 흔한 단어 (0) | 2022.07.23 |
swift 리트코드 문제풀이 - leetcode 344 문자열 뒤집기 (0) | 2022.07.21 |
swift 리트코드 문제 풀기 - leetcode 유효한 팰린드롬 (0) | 2022.07.20 |