문제
해석
file이름 문자열을 총 3가지 구간으로 나눈다.
- head
- 숫자가 최초로 나오기 전까지 모든 문자열
- number
- 숫자로만 이루워져 있는 구간
- tail
- number에 숫자가 아닌 다른 문자가 나온 이후 모든 문자열
이후 정렬 조건은 다음과 같다.
- head 기준 오름차순
- head가 같으면 number 기준 오름 차순
- number까지 같으면 처음에 주어진 순서 기준 (stable sort)
import Foundation
struct File: Comparable {
let head: String
let number: String
let tail: String
static func < (lhs: Self, rhs: Self) -> Bool {
let lhead = lhs.head.lowercased()
let rhead = rhs.head.lowercased()
if lhead == rhead {
if Int(lhs.number)! < Int(rhs.number)! { // stable sort
return true
}
}
return lhead < rhead
}
func toString() -> String {
return head+number+tail
}
}
extension String {
subscript(_ index: Int) -> String {
return String(self[self.index(self.startIndex, offsetBy: index)])
}
}
func convert(file name: String) -> File {
var head: [String] = []
var number: [String] = []
var tail: [String] = []
var headBeginFlag: Bool = true
var numberBeginFlag: Bool = false
var tailBeginFlag = false
for c in name {
if c.isNumber { // 숫자가 나왔는데
if headBeginFlag { // 현재 head면
headBeginFlag = false // head 플래그 off
numberBeginFlag = true // number 플래그 on
}
} else { // 숫자가 아닌데
if numberBeginFlag { // 현재 number면
numberBeginFlag = false // number flag off
tailBeginFlag = true // tail flag on
}
}
let s = String(c)
if headBeginFlag {
head.append(s)
} else if numberBeginFlag {
number.append(s)
} else {
tail.append(s)
}
}
return File(head: head.joined(), number: number.joined(), tail: tail.joined())
}
func solution(_ files:[String]) -> [String] {
let fileList: [File] = files.map( {convert(file: $0)}).sorted(by: <)
return fileList.map{$0.toString()}
}
'PS > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 괄호 변환 (0) | 2024.09.17 |
---|---|
[프로그래머스] 문자열 압축 (1) | 2024.09.16 |
[프로그래머스] 오픈채팅방 (1) | 2024.09.16 |
[프로그래머스] n진수 게임 (0) | 2024.09.15 |
[프로그래머스] 압축 (0) | 2024.09.15 |