본문 바로가기
자료구조&알고리즘/leetcode 풀이

swift 리트코드 문제풀이 - leetcode 937 로그 파일 재정렬

by 인생여희 2022. 7. 22.

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의 문자를 기준으로 오름차순으로 정렬해주면 끝!

 

 

 

https://leetcode.com/problems/reorder-data-in-log-files/