티스토리 뷰
🔗 문제 링크
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) }을 이용하자
'PS > 문제 풀이' 카테고리의 다른 글
| [프로그래머스/Swift] 77885번 - 2개 이하로 다른 비트 (0) | 2025.03.02 |
|---|---|
| [프로그래머스/Swift] 17679번 - 프렌즈 4블록 (0) | 2025.03.01 |
| [프로그래머스/Swift] 154538번 - 숫자 변환하기 (0) | 2025.02.27 |
| [프로그래머스/Swift] 43162번 - 네트워크 (0) | 2025.02.26 |
| [프로그래머스/Swift] 92341번 - 주차 요금 계산 (0) | 2025.02.25 |
