๐ TIL ์ค๋ ๋ฐฐ์ด ๊ฒ
๐ ํด๋ก์ ํ์ฉํด์ array ์ด์ค(?), ๋ค์ค ์ ๋ ฌํ๊ธฐ
ํด๋ก์ ๋ฅผ ์ฌ์ฉํด์ array์ ์ฌ๋ฌ ์กฐ๊ฑด๋ณ๋ก ์ ๋ ฌํด์ค ์ ์๋ค. ์ด ๋ฐฉ๋ฒ์๋, ์๋์ ๊ฐ์ ๋ฐฉ๋ฒ์ด ์๋ค.
let myGrades = [
["B", "๋ค"],
["A", "๋ฐ"],
["C", "๋"],
["B", "๊ฐ"],
["A", "๋ผ"],
["A", "๋ง"]
]
print(myGrades.sorted { ($0[0] < $1[0]) || ($0[1] > $1[1]) })
// [["A", "๋ฐ"], ["A", "๋ง"], ["A", "๋ผ"], ["B", "๋ค"], ["B", "๊ฐ"], ["C", "๋"]]
์ด๋ ๊ฒ ํ๊ฒ๋๋ฉด, ABC ์ค๋ฆ์ฐจ์์ ๊ทธ๋๋ก ์ ์งํ๋ฉด์, ๋ค์ '๊ฐ๋๋ค'๋ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ค. || ๋ ผ๋ฆฌ์ฐ์ฐ์๋ฅผ ํตํด ๊ทธ ๊ธฐ์ค์ ์ ์งํ๊ณ ๋ค์ ์ถ๊ฐ ์กฐ๊ฑด์ ์ค ์ ์๋ค.
์๋ ์ด๋ ๊ฒ ํ๋์ ํด๋ก์ ๋ด๋ถ์์ sorted by ๋ฅผ ์ด์ฉํด์ ์ ๋ ฌํ์๋๋ฐ, ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์์๋ค. ์ ๋ฐํ๋ค!
let customSort: ([String], [String]) -> Bool = { a, b in
if a[0].lowercased() != b[0].lowercased() {
return a[0].lowercased() < b[0].lowercased() // ๋ค๋ฅด๋ค๋ฉด ์ฌ์ ์์ ๋ ฌ
} else {
if let n1 = Int(a[1]), let n2 = Int(b[1]), n1 != n2 {
return n1 < n2 // ์ซ์๋ค๋ฅด๋ค๋ฉด ํฐ์์ผ๋ก ์ ๋ ฌ
}
}
return false // ๋ฌธ์๋ ๊ฐ๊ณ ์ซ์๋ ๊ฐ๋ค๋ฉด ์๋ฐ๊ฟ
}
newFiles.sort(by: customSort)
์ด๋ ๊ฒ ์ ๋ ฌ ํด๋ก์ ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ค. by: ์์ ์ฐ์ฐ์๋ฅผ ๋ฃ์ด์ผํ ๊ฒ๊ฐ์ง๋ง, ์ฐ์ฐํ๋กํผํฐ(?๋ง๋์?)๋ฅผ ๋์ ํด์ ๋ฃ์๋ค. sorted(by:) ํจ์๋ ์ธ์๋ก ์ ๋ฌ๋ฐ์ customSort(_:_:)์ ๊ท์น์ ๋ฐ๋ผ ์ด๋ ์ด๋ฅผ ์ ๋ ฌํ๊ณ ๋ฆฌํดํด์ค๋ค.
์ ๋ ฌํ ๋, ์ด๋ ๊ฒ ์กฐ๊ฑด์ ์ด์ฉํด์ ๊ธฐ์ค์ ๋ง๋ค์ด์ฃผ๊ณ ๊ทธ ๊ท๊ท์น์ ๋ฐ๋ฅด๊ฒ๋ ์ ๋ ฌํด์ฃผ๋ ๋ฐฉ์๋ ์๋ค๋ ๊ฒ์ ๊ผญ ๊ธฐ์ตํด์ผ๊ฒ ๋ค. ์์ฒ๋ผ ์ฐ์ฐํ๋กํผํฐ๊ฐ ์๋๋ผ ํจ์๋ก๋ ์ ๋ ฌ ํด๋ก์ ๊ท์น์ ์์ฑํด์ ๋ฃ์ด์ค ์ ์๋ค.
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
func backward(_ s1: String, _ s2: String) -> Bool {
return s1 > s2
}
var reversedNames = names.sorted(by: backward)
// reversedNames is equal to ["Ewa", "Daniella", "Chris", "Barry", "Alex"]
์ด๋ ๊ฒ ํ๊ฒ ๋๋, by์์์ ํด๋น ํจ์์ ๊ท์น์ ๋ฐ๋ผ ๊ฐ์ ๋ฆฌํดํด์ค๋ค.
๐ map์ ์ด์ฉํด์ Array์ ์๋ ์์๋ค์ ํฉ์ณ์ ์ถ๋ ฅํ๊ธฐ
์๋ ๋๋ for๋ฌธ์ ์ด์ฉํด์ ์ถ๋ ฅํด์ฃผ์๋ค. ๊ทผ๋ฐ ์ด๊ฑฐ... ๊ณ ์ฐจํจ์ map์ผ๋ก ์์ฉ์ด ๊ฐ๋ฅํ๋ค.
์๋๋๋ก๋ผ๋ฉด, [["a","b","c"], ["d","e","f"]] ๋ฅผ ["abc", "def"]๋ก ์ถ๋ ฅํ๊ธฐ ์ํด์ ์๋์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์งํํ๋ค.
for f in sortedFiles {
var temp = ""
for i in 0..<f.count {
temp += f[i]
}
answer.append(temp)
}
for๋ฌธ์ผ๋ก ํ [array]์ฉ ๊บผ๋ธ ํ, ๊ฑฐ๊ธฐ์ ๋ ๊ธธ์ด๋งํผ for ๋ฌธ์ ๋๋ ค์ ๋ํด์ฃผ์๋ค. ๋ฌด๋ ค ์ด์คํฌ๋ฌธ..์์ฌ์ฉํ๋ค.
ํ์ง๋ง ์ด๋ฅผ ๊ณ ์ฐจํจ์ map ๊ณผ join ์ด๋ผ๋ ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ฉด ๊ฐ๋จํ๊ฒ ์ถ๋ ฅ ๊ฐ๋ฅํ๋ค.
newFiles.map{$0.joined()}
newfile์ ์๋ array๋ค์ ํ๋ฉ์ด์ฉ ๊บผ๋ธ ํ ($0), ์ฌ๊ธฐ์๋ ๊ฒ๋ค์ string ์ผ๋ก ์ ๋ถ ์ฎ์ด์ฃผ๋ join ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค. ๊ฐ๋จ... ์ค.. ํ๋ค. .. ์์ผ๋ก ์ด๋ฐ ์ผ์ด ์์๋ map ๊ณผ join ์ ๊ผญ ๊ธฐ์ตํด๋ด์!
๐ ๋ฌธ์ ๋งํฌ
https://school.programmers.co.kr/learn/courses/30/lessons/17686
๐ ๋ด๊ฐ ํผ ํ์ด
file ๋ฌธ์์ด ๋๋๊ธฐ
- ์ฐ์ ์ฃผ์ด์ง file๋ค์ด head, number, tail ์ ๋ฐ๋ผ์ ์ ๋ ฌ ์์๊ฐ ๋ฌ๋ผ์ง๋ฏ๋ก, file์ ๋ฌธ์์ด์ ๋ถ๋ฆฌํด์ผํ๋ค๊ณ ์๊ฐํ๋ค.
- isnumber, isletter์ ์ด์ฉํด์ split ํด์ฃผ์๋ค.
- isLetter๋ ์์ด ๋์๋ฌธ์๋ฅผ ์๋ฏธํ๋ ๋ฏํ๋ค. ์จ์ ์ด๋ ํ์ดํ, ๋์ด์ฐ๊ธฐ (๊ณต๋ฐฑ)์ ์ธ์ํ์ง ๋ชปํด์, ๋ฐ๋ก ์ฒ๋ฆฌํด์ฃผ์ด์ผํ๋ค.
- isASCII๋ ์์๋๋ฐ ์ด๋ ๋ฌธ์ ์ ์ฒด๋ฅผ ์ง์นญํ๊ณ ์์ด์ letter๋, ์จ์ ๊ณต๋ฐฑ ๋ฑ๋ฑ๋ ๋ชจ๋ ํด๋นํ๋ ์กฐ๊ฑด์ด๋ผ ์ฌ์ฉํ ์ ์์๋ค.
- ์ด์ฐจํผ ํ์ผ๋ช ์ ๋ค์ด๊ฐ๋ ๊ฒ์ด ์จ์ , ํ์ดํ(-), ๊ณต๋ฐฑ๋ฟ์ด๋ผ์ ์ธ๊ฐ๋ฅผ ์ด์ฉํด์ ๋ฐ๋ก ๋ฐฐ์ด์ ๋ง๋ค์ด์ฃผ๊ณ , ์ฌ๊ธฐ์ ํฌํจํ๋์ง์ ๋ํ ์ฌ๋ถ๋ก ์กฐ๊ฑด์ฒ๋ฆฌ๋ฅผ ์งํํ๋ค.
- istail์ด๋ผ๋ ๋ณ์๋ฅผ ์ฃผ์๋ค.
- ์ซ์๋ฅผ ๊ธฐ์ค์ผ๋ก ์์ด head, ๋ค๊ฐ tail ์ธ๋ฐ, ์ด๋ฅผ ๊ตฌ๋ณํ๊ธฐ ์ํด์ bool๊ฐ์ ํ๋ ์ค ๊ฒ์ด๋ค.
- ๋ง์ฝ istail ์ด true๊ฐ์ ๊ฐ์ง๋ฉด, ์ด๋ฏธ ์ค๊ฐ์ง์ ์ ์ง๋ฌ๋ค๋ ๋ป์ด๋ฏ๋ก, ๊ทธ ์ดํ์ ๋ง๋๋ ๋ฌธ์๋ค์ ๋ชจ๋ tail์ ๋ฃ์ด์ฃผ๋ ๋ฐฉ์์ผ๋ก ์งํํ๋ค.
์ ๋ ฌํ๊ธฐ
์ ๋ ฌ ์ฝ๋๋ ์ธํฐ๋ท์ ์ฐธ๊ณ ํ๋ค. ์๋ ์๋์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์งํํ๋๋ฐ, ๋๋ฌธ์๊ฐ ๋จผ์ ์ ๋ ฌ๋๊ฑฐ๋, ๋๋ฒ์งธ ์กฐ๊ฑด๋๋ฌธ์ ์ ์กฐ๊ฑด์ด ์ ์ง๋์ง ์์ ์ฑ๋ก ๋๋ฒ์ฌ ์กฐ๊ฑด์ผ๋ก ์ ๋ ฌ์ด ๋์ด๋ฒ๋ฆฌ๋ ๊ฒฝ์ฐ๊ฐ ์๊ฒผ๋ค.
var sortedFiles = newFiles.sorted(by: { $0[0] < $1[0] })
sortedFiles = sortedFiles.sorted(by: { Int($0[1])! < Int($1[1])! })
๋ง๋ค. ์กฐ๊ฑด์ ๋๋ฒ ๋ฐ๋ก ์ฃผ์์ผ๋๊น, ์ฒซ๋ฒ์งธ ์ ๋ ฌํ ๊ฒ์ด ๋๋ฒ์ฌ๊น์ง ์ ์ง๋์ง ์์ ์ฑ๋ก ๋ฐ๋ก ์ ๋ ฌ๋๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๋์๋ฌธ์๋ฅผ ๋ฐ๋ก ๊ตฌ๋ถํ์ง ์๋๋ค๋ ์กฐ๊ฑด์ด ๋์์๋๋ฐ, ๋๋ ๊ทธ๋ฅ ์ ๋ ฌํด๋ฒ๋ ธ๊ธฐ ๋๋ฌธ์ ๋์๋ฌธ์์ ๋ํ ์ฐ์ ์์๋ ๊ณ ๋ คํ์ฑ๋ก ์ ๋ ฌ์ด ์งํ๋๋ค. (a์ A๋ฅผ ๋น๊ตํจ, ์ค์ํํธ๋ ๋๋ฌธ์๊ฐ ์๋ฌธ์๋ณด๋ค ์์๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ค.)
๊ทธ๋์ ์๋์ ๊ฐ์ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ๋ค.
let customSort: ([String], [String]) -> Bool = { a, b in
if a[0].lowercased() != b[0].lowercased() {
return a[0].lowercased() < b[0].lowercased() // ๋ค๋ฅด๋ค๋ฉด ์ฌ์ ์์ ๋ ฌ
} else {
if let n1 = Int(a[1]), let n2 = Int(b[1]), n1 != n2 {
return n1 < n2 // ์ซ์๋ค๋ฅด๋ค๋ฉด ํฐ์์ผ๋ก ์ ๋ ฌ
}
}
return false // ๋ฌธ์๋ ๊ฐ๊ณ ์ซ์๋ ๊ฐ๋ค๋ฉด ์๋ฐ๊ฟ
}
newFiles.sort(by: customSort)
๋ฌธ์ ์กฐ๊ฑด์์ ๋์๋ฌธ์์ ๊ตฌ๋ถ์ ์๋ค๊ณ ํ๊ธฐ ๋๋ฌธ์, a์ A๋ฅผ ๋น๊ตํ์ง ์๊ณ lowercase๋ก ๋ณํ์์ผ์ ๋น๊ตํด์ฃผ์๋ค. ์ด๋ ๊ฒ ํ๊ฒ ๋๋ฉด A๋ฅผ ์ ๊น a๋ก ๋ฐ๊ฟ์ ๋น๊ตํ๊ฒ ๋๋ฏ๋ก, ๋๊ฐ์ ๋์ผํ ์ฐ์ ์์๊ฐ ๋ถ์ฌ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฌธ์์ ์ ๋ ฌ๋ ์์๊ฐ ๊ฐ๋ค๋ฉด, number์ธก์์ ์ ๋ ฌ์ ์งํํ๋ค. ์ซ์๊ฐ ๋ค๋ฅด๋ค๋ฉด ํฐ์์ผ๋ก ์ ๋ ฌํด์ฃผ์๊ณ , ๋ง์ง๋ง์ผ๋ก if๋ฌธ์ ํต๊ณผํ์ง ์์ ๊ฒ๋ค์ ๋ํด์๋ ๋ฌธ์๋ ๊ฐ๊ณ ์ซ์๋ ๊ฐ๋ค๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ false๋ฅผ ๋ฐํํ๋ฉด์ ์๋ฌด๋ จ ์ ๋ ฌ๋ ํด์ฃผ์ง ์์๋ค.
๐ ์ฒซ๋ฒ์งธ ์๋ (์คํจ 9๊ฐ, 55์ )
์ฝ๋๋ ๋๋ณด๊ธฐ๋ฅผ ํด๋ฆญํด๋ณด์.
ํ๋ฆฐ ์ฝ๋
func solution(_ files:[String]) -> [String] {
var answer = [String]()
var newFiles = splitFiles(files)
let customSort: ([String], [String]) -> Bool = { a, b in
if a[0].lowercased() != b[0].lowercased() {
return a[0].lowercased() < b[0].lowercased() // ๋ค๋ฅด๋ค๋ฉด ์ฌ์ ์์ ๋ ฌ
} else {
if let n1 = Int(a[1]), let n2 = Int(b[1]), n1 != n2 {
return n1 < n2 // ์ซ์๋ค๋ฅด๋ค๋ฉด ํฐ์์ผ๋ก ์ ๋ ฌ
}
}
return false // ๋ฌธ์๋ ๊ฐ๊ณ ์ซ์๋ ๊ฐ๋ค๋ฉด ์๋ฐ๊ฟ
}
newFiles.sort(by: customSort)
return newFiles.map{$0.joined()}
}
func splitFiles(_ files: [String]) -> [[String]] {
let symbol = [".", "-", " "]
var splitFiles = [[String]]()
for f in files {
var head = ""
var num = ""
var tail = ""
var istail = false
for char in f {
if (char.isLetter && istail) || (istail && symbol.contains(String(char))) {
tail += String(char)
} else if char.isNumber {
num += String(char)
istail = true
} else if (!istail && char.isLetter) || (!istail && symbol.contains(String(char))) {
head += String(char)
}
}
splitFiles.append([head, num, tail])
}
return splitFiles
}
print(solution(files))
๊ฒฐ๊ณผ๋,, ใ ... ์ถฉ๊ฒฉ..
์ํ๋ ธ๋์ง ์์๋ณด์...
๐ ๋๋ฒ์งธ ์๋ (์ ๋ต!)
์ ํ๋ ธ์๊น!! ๋ฐํ์์๋ฌ๋, ์๊ฐ์ด๊ณผ๋ ์๋๊ณ ์คํจ์ธ๊ฒ์ผ๋ก ๋ณด์, ๋ช๊ฐ์ ์์ธ์ผ์ด์ค์์ ์ ๋ต์ ์ ๋ฆฌํดํ์ง ๋ชปํ์ ๊ฒ์ด๋ค. ์ด๋ค ์์ธ์ฌํญ์ด ์์์ง 'ํ๋ก๊ทธ๋๋จธ์ค ์ง๋ฌธํ๊ธฐ'๋ฅผ ๋ค์ง๋ฉด์, ์ฌ๋ฌ ์ฌ๋๋ค์ ์๋ฌ์ฌํญ๋ค์ ๋ณด๋ฉด์ ์์ธ์ ์ฐพ์๋์ฐ๋ค. (์ด๊ฑฐ ์ด๋ ๊ฒ ์์ธ์ผ์ด์ค๋ฅผ ์ง๋ฌธํ๊ธฐ, ์ด๋ฐ๊ฑฐ ์์ผ๋ฉด ์ด๋ป๊ฒ ์๊ฐํด๋ด์ฃ ? ใ ใ ์ํ๋ณผ๋ ์ด๋ฐ ์์ธ์ผ์ด์ค๋ฅผ ์ด๋ป๊ฒ ์๊ฐํ๋ ๋ง์ด๋ ใ ใ )
์ฌ๋ฌ์ฌ๋๋ค์ ์ผ์ด์ค๋ฅผ ์ดํด๋ณด๋ค๊ฐ, '์ซ์๋ก ๋๋๋ ํ์ผ๋ช '์ผ ๊ฒฝ์ฐ์, ์ซ์๋ฅผ ์ ๋๋ก tail์ ๋ฃ์ง ๋ชปํ๋ ์ด์๊ฐ ์์๋ค๊ณ ํ๋ค. ๋ฐ๋ก ์ผ์ด์ค๋ฅผ ์ ์ฉํด๋ณด์๋ค.
let files = ["O00321", "O49qcGPHuRLR5FEfoO00321"]
๊ฒฐ๊ณผ๊ฐ ์์ฒ๋ผ ๋์๋ค. head๋ ์์ด O๊ฐ ์ ๋ค์ด๊ฐ์ง๋ง, ๋๋ฒ์งธ ์ผ์ด์ค number์ ์ฃผ๋ชฉํด๋ณด์. 49๋ง number์ ๋ค์ด๊ฐ๊ณ , qcGPHuRLR5FEfoO00321๋ ์ ๋ถ tail ์ ๋ค์ด๊ฐ์ผํ๋๋ฐ, tail ๋ถ๋ถ์ ๋ค์ด๊ฐ์ผํ ์ซ์๋ค์ด ์ ๋ถ number์ ๋ค์ด๊ฐ์๋ค.
๋ด๊ฐ ์ง ์กฐ๊ฑด์ ์ดํด๋ณด์.
if (char.isLetter && istail) || (istail && symbol.contains(String(char))) {
tail += String(char)
} else if char.isNumber {
num += String(char)
istail = true
} else if (!istail && char.isLetter) || (!istail && symbol.contains(String(char))) {
head += String(char)
}
isNumber์ ํด๋นํ๋ฉด ๋ฌด์กฐ๊ฑด num string์๋ค๊ฐ ์ถ๊ฐ์์ผ์ฃผ๋๊ฒ์ด ๋ฌธ์ ์๋ค. ๊ทธ๋ผ tail๋ถ๋ถ์ ๋ค์ด๊ฐ ์ซ์๋ค์ ์ด๋ป๊ฒ ๊ตฌ๋ณํด์ฃผ๋ฉด ์ข์๊น?
ํ์ผ๋ช ์ '์ซ์'๋ก head์ tail๋ก ๊ตฌ๋ณ๋๋ค. ๊ทธ๋์ A12B34 ๊ฐ ์๋ค๊ณ ์น ๋, 12๋ฅผ ๊ธฐ์ค์ผ๋ก A๋ head, B34๋ tail ๋ก ๊ฐ์ผํ๋ค. ๋ค์ 3๊ณผ 4๋ ๊ทธ๋ฌ๋ฉด, ์ซ์์ด๋ฉด์, tail ์ด ๋น์ด์์ง ์์ผ๋ฉด, tail ์ ๋ฃ์ผ๋ฉด๋๋ค. 1๊ณผ 2๋ ์ซ์์ด๋ฉด์, tail ์ด ๋น์ด์์ ๊ฒฝ์ฐ, num์๋ค๊ฐ ์ถ๊ฐํด์ฃผ๋ฉด ๋ ๊ฒ์ด๋ค. ์กฐ๊ฑด์ ์๋์ ๊ฐ์ด ๋ฐ๊พธ์ด์ ์งํํด๋ณด๋, ์ฑ๊ณตํ๋ค โค๏ธ๐ฅ
if (char.isLetter && istail) || (istail && symbol.contains(String(char))) || (!tail.isEmpty && char.isNumber && istail) {
tail += String(char)
} else if char.isNumber && tail.isEmpty {
num += String(char)
istail = true
} else if (!istail && char.isLetter) || (!istail && symbol.contains(String(char))) {
head += String(char)
}
ํด,, ๋น๊ต์ ์ค๋ฅ๋ฅผ ๋นจ๋ฆฌ์ฐพ์์ ์ฝ 30๋ถ๋ง์ ํด๊ฒฐํ๋ค. ๋๋์ฒด... ์ฝํ ๋ณผ๋ ์์ธ์ผ์ด์ค๋ฅผ ์ด๋ป๊ฒ ์๊ฐํด๋ต๋๊ณ ์ค ใ ใ ใ ๋๋ฌด์ด๋ ต๋ค.
๐ ์ ๋ต์ฝ๋
func solution(_ files:[String]) -> [String] {
var newFiles = splitFiles(files)
let customSort: ([String], [String]) -> Bool = { a, b in
if a[0].lowercased() != b[0].lowercased() {
return a[0].lowercased() < b[0].lowercased()
} else {
if let n1 = Int(a[1]), let n2 = Int(b[1]), n1 != n2 {
return n1 < n2
}
}
return false
}
newFiles.sort(by: customSort)
return newFiles.map{$0.joined()}
}
func splitFiles(_ files: [String]) -> [[String]] {
let symbol = [".", "-", " "]
var splitFiles = [[String]]()
for f in files {
var head = ""
var num = ""
var tail = ""
var istail = false
for char in f {
if (char.isLetter && istail) || (istail && symbol.contains(String(char))) || (!tail.isEmpty && char.isNumber && istail) {
tail += String(char)
} else if char.isNumber && tail.isEmpty {
num += String(char)
istail = true
} else if (!istail && char.isLetter) || (!istail && symbol.contains(String(char))) {
head += String(char)
}
}
print("head์ \(head), number์ \(num), tali ์ \(tail)")
splitFiles.append([head, num, tail])
}
return splitFiles
}