[프로그래머스 LV2] 파일명 정렬

Junyoung Park·2022년 8월 23일
0

코딩테스트

목록 보기
583/631
post-thumbnail

1. 문제 설명

파일명 정렬

2. 문제 분석

문자열 파일을 통해 파일 구조체를 생성한다. 이때 head, number, tail을 주어진 기준에 따라 분리해야 한다. 반환한 값을 통해 정렬한다. 우선순위 큐를 쓴다면 시간복잡도를 더 줄일 수 있다.

3. 나의 풀이

struct File {
    let head: String
    let number: String
    let tail: String
    let order: Int
    
    var original: String {
        return head + number + tail
    }
}

func solution(_ files:[String]) -> [String] {
    var results = [File]()
    for item in files.enumerated() {
        let index = item.offset
        let file = item.element
        let result = convertFile(file, index)
        results.append(result)
    }
    results.sort(by: { first, second in
        if first.head.lowercased() < second.head.lowercased() {
            return true
        } else if first.head.lowercased() == second.head.lowercased() {
            if Int(first.number)! < Int(second.number)! {
                return true
            } else if Int(first.number)! == Int(second.number)! {
                return first.order <= second.order
            } else {
                return false
            }
        } else {
            return false
        }
    })
    let sortedResults = results.map{$0.original}
    return sortedResults
}

func convertFile(_ file: String, _ order: Int) -> File {
    var tmp = ""
    var curPart = 0
    var head: String = ""
    var number: String = ""
    var tail: String = ""
    
    for letter in file {
        switch curPart {
            case 0:
                if !letter.isNumber {
                    tmp += String(letter)
                } else {
                    head = tmp
                    tmp = String(letter)
                    curPart += 1
                }
            case 1:
                if tmp.count < 5 {
                    if letter.isNumber {
                        tmp += String(letter)
                    } else {
                        number = tmp
                        tmp = String(letter)
                        curPart += 1
                    }
                } else {
                    number = tmp
                    tmp = String(letter)
                    curPart += 1
                }
            case 2:
                tmp += String(letter)
            default: continue
        }
    }
    if curPart == 1 {
        number = tmp
    } else {
        tail = tmp
    }
    let result = File(head: head, number: number, tail: tail, order: order)
    
    return result
}
profile
JUST DO IT

0개의 댓글