티스토리 뷰

Algorithm

Algorithm) Programmers- 파일명 정렬 swift

행복하고 싶은 사람 2022. 10. 26. 15:56

https://school.programmers.co.kr/learn/courses/30/lessons/17686

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

Head, Number, Tail 분리해주고 Head, Number에 따라 정렬 진행해주면 되는 문제였습니다.

대문자, 소문자 같은 취급이므로 비교할때 소문자 혹은 대문자로 일치시켜서 정렬하는 등 포인트들을 잘 잡으면 쉽게 풀 수 있는듯합니다.

//
//  파일명 정렬.swift
//  Algorithm_swfit
//
//  Created by ohhyeongseok on 2022/10/26.
//

func cmp( a: [String],  b: [String]) -> Bool {
    if a[0].lowercased() != b[0].lowercased() {
        return a[0].lowercased() < b[0].lowercased()
    } else {
        return Int(a[1])! < Int(b[1])!
    }
}
func solution(_ files:[String]) -> [String] {
    var arr = [[String]](repeating: Array(repeating: "", count: 3), count: files.count)
    for i in 0..<files.count {
        var trigger = -1
        var fileName = files[i].map({$0})
        for j in 0..<fileName.count {
            if trigger < 0 {
                if fileName[j].isNumber {
                    arr[i][1] += String(fileName[j])
                    trigger += 1
                } else {
                    arr[i][0] += String(fileName[j])
                }
            } else if trigger < 4  {
                if !fileName[j].isNumber {
                    arr[i][2] += String(fileName[j])
                    trigger = 5
                } else {
                    arr[i][1] += String(fileName[j])
                    trigger += 1
                }
            } else {
               arr[i][2] += String(fileName[j])
            }
        }
    }
    var tmp = arr.sorted(by: cmp(a:b:))
    var ans = [String]()
    for component in tmp {
        let str = component[0] + component[1] + component[2]
        ans.append(str)
    }
    return ans
}

 

프로그래머스에서 다른 분의 코드를 봤는데

extension String{
    var numeric: ClosedRange<Character> { return "0"..."9" }
    var head: String{
        return self.prefix { numeric.contains($0) == false }.uppercased()
    }
    var number: Int {
        return Int( self.drop   { numeric.contains($0) == false}
                        .prefix { numeric.contains($0) == true })!
    }
}

func solution(_ files:[String]) -> [String] {

    return files.enumerated().sorted { (lhs, rhs) in
        let l = lhs.element
        let r = rhs.element
        if l.head != r.head { return l.head < r.head}
        if l.number != r.number { return l.number < r.number}
        return lhs.offset < rhs.offset

    }.map{ $0.element }
}

실행 시간이 오래걸리긴 하지만 깔끔하네요.. 이렇게도 할 수 있구나 

배워갑니다

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함