728x90
반응형
programmers.co.kr/learn/courses/30/lessons/17686
안녕하세요 후르륵짭짭 입니다.
저는 이 문제를 정규표현식으로 풀었습니다.
정규식을 잘 알고 있다면 어려운 문제는 아니였습니다.
** 저의 풀이 **
//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
처음에 정규표현식으로 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
반응형
'Xcode > Swift - Algorithm' 카테고리의 다른 글
Swift ) 프로그래머스(Lv3) - 보석 쇼핑 (TwoPointer & Hash) (0) | 2020.09.11 |
---|---|
Swift ) 프로그래머스(Lv2) - [3차] n진수 게임 (String) (0) | 2020.09.10 |
Swift ) 프로그래머스(Lv2) - [3차] 압축 (Hash) (0) | 2020.09.10 |
Swift ) 프로그래머스(Lv2) - [1차]프렌즈4블록 (Simulation) (0) | 2020.09.08 |
Swift ) 프로그래머스(Lv2) - [3차] 방금 그곡 (String) (1) | 2020.09.08 |
댓글