본문 바로가기
Xcode/Swift - Algorithm

Swift ) 프로그래머스(Lv2) - [3차] 파일명 정렬 (RegularExpression)

by 후르륵짭짭 2020. 9. 10.
728x90
반응형

programmers.co.kr/learn/courses/30/lessons/17686

 

코딩테스트 연습 - [3차] 파일명 정렬

파일명 정렬 세 차례의 코딩 테스트와 두 차례의 면접이라는 기나긴 블라인드 공채를 무사히 통과해 카카오에 입사한 무지는 파일 저장소 서버 관리를 맡게 되었다. 저장소 서버에는 프로그램��

programmers.co.kr

안녕하세요 후르륵짭짭 입니다.

저는 이 문제를 정규표현식으로 풀었습니다.

정규식을 잘 알고 있다면 어려운 문제는 아니였습니다.

 

** 저의 풀이 **

//28:56
func solution(_ files:[String]) -> [String] {
    
    var stack : [(head : String , number : Int , tail : String, index : Int)] = []
    
    for (index , element ) in files.enumerated(){
        
        let HEAD = returnStringByRex(pattern: "[^(0-9)]+", word: element).first!
        let NUMBER = returnStringByRex(pattern: "[0-9][0-9]?[0-9]?[0-9]?[0-9]?", word: element).first!
        let TAIL = element.replacingOccurrences(of: HEAD + NUMBER, with: "")
//        print(HEAD)
//        print(NUMBER)
//        print(TAIL)
        stack.append((HEAD, Int(NUMBER)!, TAIL , index))
    }
    
    stack = stack.sorted(by: { (element1, element2) -> Bool in
        
        let element1_head = element1.head.lowercased()
        let element2_head = element2.head.lowercased()
        
        if element1_head == element2_head {
            
            if element1.number == element2.number {
                return element1.index < element2.index
            }
            
            return element1.number < element2.number
            
        }
        
        
        return element1_head < element2_head
    })
    
    var answer : [String] = []
    
    for element in stack {
        
        let index = element.index
        
        answer.append(files[index])
    }
    
    return answer
}

func returnStringByRex(pattern : String , word : String) -> [String] {
    
    do {
        let regex = try NSRegularExpression(pattern: pattern, options: .caseInsensitive)
        
        let result = regex.matches(in: word, options: [], range: NSRange(location: 0, length: word.count))
        
        let rexStrings = result.map { (element) -> String in
            
            let range = Range(element.range, in: word)!
            
            return String(word[range])
            
        }
        
        return rexStrings
    } catch let error {
        print(error.localizedDescription)
    }
    
    return []
    
}

 

예전에 정규표현식에 대해 다룬 적이 있습니다.

hururuek-chapchap.tistory.com/84?category=910687

 

Swift ) 프로그래머스(Lv1) - [1차] 다트 게임 (RegularExpression&Split)

programmers.co.kr/learn/courses/30/lessons/17682 코딩테스트 연습 - [1차] 다트 게임 programmers.co.kr 안녕하세요 후르륵짭짭 입니다. 오늘은 하루에 두개의 글을 남깁니다 ㅎㅎㅎ (언제 쯤 프로그래머스의..

hururuek-chapchap.tistory.com

처음에 정규표현식으로 Head , Number, Tail을 파싱해줍니다.

그리고 수행하라는데로 정렬을 해주면 됩니다.

이 문제는 정규식을 사용하면 쉽게 해결 할 수 있는 문제 였습니다.

 

** 새롭게 알게된 사실 **

Number를 파싱할때, 어떻게하면 최대 5글자 까지 있을 수도 있고 없을 수도 없는데,,, 파싱할 수 있을지 몰랐습니다.

그래서 찾아보니깐, []? 이렇게 하면 ?은 0...1 개를 의미한다. 따라서 한개가 존재할 수도 있고 없을 수도 있다를 의미한다.

let test = "img1...png"

let numb = returnStringByRex(pattern: "[0-9][0-9]?[0-9]?[0-9]?[0-9]?", word: test)

//결과
["1"]

이렇게 하니 성공적으로 원하는 만큼 파싱이 가능해졌다.

728x90
반응형

댓글