PS/문제 풀이

[프로그래머스/Swift] 17686번 - 파일명 정렬

시르베어 2025. 2. 28. 14:38

🔗 문제 링크

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

💡 구현 아이디어

단순 구현문제 및 정렬

정렬 기준

  • Head : 사전순 정렬(대 소문자 구분X) - uppercase, lowercase 사용
  • Number : 앞에 붙은 0은 무시 - String to Int로 제거
  • Head와 Number가 같은 경우 : 들어온 인덱스도 함께 저장해서 비교

💻 코드

struct file {
  let name: String // 파일명
  let head: String // 헤더
  let num: Int // 넘버
  let index: Int // 들어온 순서
}

func solution(_ files:[String]) -> [String] {
  let files: [file] = filesConvert(files)
  
  let sortedFiles = files.sorted {
    if $0.head == $1.head {
      if $0.num == $1.num {
        return $0.index < $1.index
      }
      return $0.num < $1.num
    }
    return $0.head < $1.head
  }
  return sortedFiles.map { $0.name }
}

func filesConvert(_ files: [String]) -> [file] {
  var arr: [file] = []
  
  for (idx, contentStr) in files.enumerated() {
    let content = contentStr.map{ String($0) }
    
    var tempStr: String = ""
    var head: String = ""
    var isHead: Bool = true
    var number: String = ""
    
    for i in 0..<content.count {
      if isHead { // 헤드 부분
        if content[i] == "0" || content[i] == "1" || content[i] == "2" || content[i] == "3" || content[i] == "4" || content[i] == "5" || content[i] == "6" || content[i] == "7" || content[i] == "8" || content[i] == "9" { // 숫자가 등장하면 여기부터 넘버
          head = tempStr.lowercased()
          tempStr = ""
          isHead = false
        }
      }else { // 넘버 부분
        if content[i] != "0" && content[i] != "1" && content[i] != "2" && content[i] != "3" && content[i] != "4" && content[i] != "5" && content[i] != "6" && content[i] != "7" && content[i] != "8" && content[i] != "9" { // 숫자가 아닌게 등장하면 여기부터 테일
          number = tempStr
          tempStr = ""
          break
        }
      }
      tempStr += content[i]
    }
    if tempStr != "" { number = tempStr }
    let data = file(name: contentStr, head: head, num: Int(number)!, index: idx)
    arr.append(data)
  }
  return arr
}

❌ 틀린 이유 및 틀린 부분

⏳ 시간 복잡도

  • fileConvert 함수에서 각 파일과 파일의 파일명을 전부 순회해서 돌지만 파일의 최대는 1000개, 파일명은 100글자 그럼 최대로 반복이 돌 경우 발생하는 연산은 100000(십만번) 이므로 시간은 충분
  • sorted 함수의 시간복잡도 : O(n log n) 1000 * (log 1000) = 3000
  • 전체적으로 파일의 수가 작고 파일명이 짧기에 O(n2)도 시간이 충분할 듯 하다

📌 풀이 또는 기억할 정보

  • String.split은 seperator를 쓰고 String.Components는 speratedBy를 쓴다.
  • String.split은 “”이 가능하지만 Components는 “”이 불가능하다
  • String을 배열로 만들땐 Array(String)을 하거나 map{ String($0) }을 이용하자