본문 바로가기

기타공부

2018 KAKAO BLIND RECRUITMENT 파일명 정렬 Swift

Swift로 풀어보는 파일명 정렬

 

import UIKit

typealias HNT = (String , String , String)

//파일을 HEAD , NUMBER , TAIL 부분으로 나눠주는 로직
//
func HEAD_NUMBER_TAIL_SLICE(_ item : String) -> HNT{
    var Head : String = ""
    var Number : String = ""
    var HeadIndex : Int = 0
    var NumberIndex : Int = 0
    var Tail : String = ""
    //꼬리부분을 알아내기 위해 사용
    let LetterPlus : [String] = [" ",".","-"]
    //받아온 String 을 배열 로 변경
    let Name = item.map { $0 }
    
    //Head 찾기
    //받아온 스트링의 앞부분부터 숫자가 언제나오는지 찾기
    for index in 0..<Name.count {
        if(Name[index].isNumber){
            HeadIndex = index
            Head = item.substring(from: 0, to: HeadIndex - 1)
            break
        }
    }
    //Number찾기
    //Head부분 이후 부터 LetterPlus + String 을 포함한 값이 나오기 전까지 for문
    for index in HeadIndex..<Name.count {
        if(Name[index].isLetter || LetterPlus.contains(String(Name[index]))){
            NumberIndex = index
            Number = item.substring(from: HeadIndex , to: NumberIndex - 1)
            break
        }
    }
    
   
    //나머지 값은 자연스럽게 Tail됨
    Tail = item.substring(from: NumberIndex , to: Name.count - 1)
    
    return (Head , Number , Tail)
}





func solution(_ files:[String]) -> [String] {
    var HNTS : [HNT] = []
    
    //받아온 String 배열을 Head Number Tail 나눠줌
    HNTS = files.map{ HEAD_NUMBER_TAIL_SLICE($0) }
    //우선순위가 낮은 숫자순으로 먼저 정렬을 해줌
    HNTS.sort{ Int($0.1)! < Int($1.1)! }
    //그후 대소문자 구분을 없이 하기위해 소문자로 계산하여 Head 를 정렬
    HNTS.sort{ $0.0.lowercased() < $1.0.lowercased() }
    //그후 Head Number Tail 나눠준것을 다시 합쳐주는 작업을 실행
    return HNTS.map({ $0.0 + $0.1 + $0.2  })
}






//Swift에 따로 substring 이 없기떄문에 substring 을 따로 구현
extension String {
    func substring(from: Int, to: Int) -> String {
        guard from < count, to >= 0, to - from >= 0 else {
            return ""
        }
        // Index 값 획득
        let startIndex = index(self.startIndex, offsetBy: from)
        let endIndex = index(self.startIndex, offsetBy: to + 1) // '+1'이 있는 이유: endIndex는 문자열의 마지막 그 다음을 가리키기 때문
        // 파싱
        return String(self[startIndex ..< endIndex])
    }
}


print(solution(["img12.png", "img10.png", "img02.png", "img1.png", "IMG01.GIF", "img2.JPG","F-5 Freedom Fighter", "B-50 Superfortress", "A-10 Thunderbolt II", "F-14 Tomcat"]))

 

결과값 :

 

["A-10 Thunderbolt II", "B-50 Superfortress", "F-5 Freedom Fighter", "F-14 Tomcat", "img1.png", "IMG01.GIF", "img02.png", "img2.JPG", "img10.png", "img12.png"]

 

 

출처 : https://programmers.co.kr/learn/courses/30/lessons/17686?language=swift 

 

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

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

programmers.co.kr

 

코테 공부를 따로 공부하지 않습니다. 심심할때 시간때울려고 풀고있습니다. 
더 좋은 정답이 충분히 있을거라고 생각합니다.