PS/프로그래머스

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

Hamp 2024. 9. 15. 20:50
반응형

문제

 

프로그래머스

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

programmers.co.kr

 

해석

file이름 문자열을 총 3가지 구간으로 나눈다.

  • head
    • 숫자가 최초로 나오기 전까지 모든 문자열
  • number
    • 숫자로만 이루워져 있는 구간
  • tail
    • number에 숫자가 아닌 다른 문자가 나온 이후 모든 문자열 

이후 정렬 조건은 다음과 같다.

  1. head 기준 오름차순
  2. head가 같으면 number 기준 오름 차순
  3. 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()}
}

 

 

반응형