2021. 5. 25. 18:04ใ๐ง๐ป๐ป iOS ๊ฐ๋ฐ/Swift - Algorithm - Solutions
๐ต๐ป ๋ฌธ์ ํด์
ํ์ผ ์ ์ฅ์ ์๋ฒ ๊ด๋ฆฌ๋ฅผ ๋งก๊ฒ ๋ ๋ฌด์ง๊ฐ ๊ธฐ์กด์ ์ด๋ฆ ์์ผ๋ก ์ ๋ ฌ๋ ํ์ผ๋ค์ ๋ค์ ๋ณด๊ธฐ ์ข๊ฒ ์ ๋ ฌํ๋ ค๊ณ ํฉ๋๋ค. ํ์ผ๋ช ์ ํฌ๊ฒ 3 ๊ฐ์ง๋ก ๊ตฌ์ฑ๋๋๋ฐ HEAD, NUMBER, TAIL์ ๋๋ค. ๊ฐ๊ฐ์ ํน์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํ์ผ๋ช ์์ ๋จผ์ HEAD๊ฐ ๋ฑ์ฅํ๋ฉฐ ๊ทธ ์ดํ 0์์ ์ต๋ 99999๊น์ง์ NUMBER๊ฐ ๋ฑ์ฅํฉ๋๋ค. ์ดํ TAIL์ด ๋ฑ์ฅํ์ง๋ง ์ ๋ ฌ๊ธฐ์ค์๋ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ์๊ฐํ์ง ์๊ฒ ์ต๋๋ค. ์ ๋ ฌ ์ฐ์ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- HEAD ๊ธฐ์ค์ผ๋ก ์ฌ์ ์์ผ๋ก ์ ๋ ฌํ๋ค. ์ด๋ ๋์๋ฌธ์๋ ๊ตฌ๋ณํ์ง ์์ต๋๋ค.
- HEAD๊ฐ ๋์ผํ ๊ฒฝ์ฐ, NUMBER๋ฅผ ๊ธฐ์ค ์ค๋ฆ์ฐจ์ ์ ๋ ฌํฉ๋๋ค.
- HEAD์ NUMBER๊ฐ ๋ชจ๋ ๋์ผํ๋ค๋ฉด, ์ ๋ ฅ์์๋๋ก ์ ๋ ฌํฉ๋๋ค.
๋ฐ๋ผ์ ํ์ผ๋ช ์ด ์ฃผ์ด์ง๋ฉด HEAD์ NUMBER ๊ทธ๋ฆฌ๊ณ ์ ๋ ฅ ์์ ์ด ์ธ ๊ฐ์ง๋ฅผ ๋ฝ์๋ด์ ๋ฐฐ์ด์ ์ ์ฅํ ํ, ์ ๋ ฌ ๊ท์น์ ๋ง๊ฒ ์ ๋ ฌํ์ฌ ๋ฆฌํดํ๋ ๋ฐฉ์์ผ๋ก ์ ๊ทผํด๋ณด์์ต๋๋ค. ๋จผ์ ํ์ผ๋ช ์ String ํ์ ๋ฉ์๋์ธ .components๋ฅผ ์ด์ฉํ์ฌ ์ซ์๋ฅผ ์ ์ธํ ๋ฌธ์์ด๋ค๋ก ๋๋์ด ์ฃผ๊ณ ๊ทธ ์ฒซ ๋ฒ์งธ ์์๋ฅผ HEAD๋ก ์ถ์ถํ์ต๋๋ค.
let numbers: CharacterSet = ["0","1","2","3","4","5","6","7","8","9"]
for idx in 0..<files.count {
let fileComponents = files[idx].components(separatedBy: numbers)
var temp = [String]()
for component in fileComponents {
if component != "" {
temp.append(component)
}
}
let head = temp[0]
}
๊ทธ ํ, ๋ณธ๋ ํ์ผ๋ช ์์ HEAD๋ฅผ ์ ๊ฑฐํ๋ฉด ๋ค์ ๋ฌธ์๊ฐ ๋ฑ์ฅํ๊ธฐ ์ ๊น์ง ์ซ์๋ค์ NUMBER๋ผ๊ณ ํ๋จํ ์ ์์ต๋๋ค. String ํ์ ๋ฉ์๋์ค .replacingOccurrences() ๋ฅผ ์ฌ์ฉํ์ฌ HEAD๋ฅผ ์ ๊ฑฐํ ํ, ์ซ์๋ฅผ ๊ตฌํด๋ณด์์ต๋๋ค.
๊ทธ ํ, HEAD์ ๋์๋ฌธ์ ๊ตฌ๋ณ์ ์์ ๊ธฐ์ํด, ๋๋ฌธ์๋ก ๋ณํํ๊ณ , ์์ ๊ตฌํ "00100"์ฒ๋ผ ์์ 0์ ํฌํจํ ์ซ์๋ค์ Int() ์์ฑ์๋ฅผ ํตํด 0์ ์ ๊ฑฐํ Int ๊ฐ์ผ๋ก NUMBER๋ฅผ ๊ตฌํฉ๋๋ค. ์ด๋ฅผ (String, Int, Int) ํํ์ ์ ์ฅํ๊ณ ๋ฐฐ์ด์ ๋ด์ ์ ๋ ฌํ์ฌ ์ ๋ต์ ๊ตฌํฉ๋๋ค.
๐ฆ ๋ฌธ์ ํ์ด & ์ฝ๋
func solution(_ files:[String]) -> [String] {
let numbers: CharacterSet = ["0","1","2","3","4","5","6","7","8","9"]
let numbersString: [Character] = ["0","1","2","3","4","5","6","7","8","9"]
var headNumberInputOrder = [(head: String, number: Int, idx: Int)]()
var answer = [String]()
for idx in 0..<files.count {
// file[idx] = "foo010bar020.zip"
let fileComponents = files[idx].components(separatedBy: numbers)
var temp = [String]()
// fileComponents = ["foo","" ,"" ,"" ,"bar" ,"" ,"" ,"" ,".zip"]
for component in fileComponents {
if component != "" {
temp.append(component)
}
}
// temp = ["foo", "bar", ".zip"]
let head = temp[0]
let removeHead = files[idx].replacingOccurrences(of: head, with: "")
// removeHead = "010bar020.zip"
var number = ""
for nums in removeHead {
if numbersString.contains(nums) {
number += String(nums)
} else {
break
}
}
// ("FOO", 10, 0) ๋ก ์ ์ฅ (๋๋ฌธ์ํํ HEAD, NUMBER, ์
๋ ฅ์์)
headNumberInputOrder.append((head.uppercased(), Int(number)!, idx))
}
// ๊ธฐ์ค์ ๋ง๊ฒ ์ ๋ ฌ
headNumberInputOrder.sort {
if $0.head == $1.head {
if $0.number == $1.number {
return $0.idx < $1.idx
}
return $0.number < $1.number
}
return $0.head < $1.head
}
// ๋ฐฐ์ด์ ํ์ํ๋ฉฐ answer์ ์ ๋ ฌ ์์๋๋ก ์ ์ฅ
for tuple in headNumberInputOrder {
answer.append(files[tuple.2])
}
return answer
}
๐คท๐ปโ๏ธ ๋ ์๊ฐํด๋ณด๊ธฐ
์ ํ์ด๋ ์ข ์ง์ ๋ถ ํ๊ฒ HEAD์ NUMBER๋ฅผ ๊ตฌํ ๊ฒ ๊ฐ์ต๋๋ค. ๋ค๋ฅธ ๋ถ๋ค์ ํ์ด๋ฅผ ์ฐธ๊ณ ํ๋ ํจ์ฌ ๋ ์ฝ๊ณ ๊ฐํธํ ํ์ด ๋ฒ๋ค์ด ์๋๊ตฐ์. ์์ง ๊ฐ ๊ธธ์ด ๋จผ ๊ฒ ๊ฐ์ต๋๋ค.. ํฌ๊ฒ HEAD์ NUMBER๋ฅผ ๊ตฌํ ๋ ์ ๊ท์์ ์ด์ฉํ์ฌ ๊ตฌํ๋ ๋ฐฉ๋ฒ๊ณผ drop๊ณผ prefix๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ด์ ๊ฐ๋ตํ๊ฒ ์ ๋ฆฌ๋ฅผ ํด๋ณด๊ฒ ์ต๋๋ค.
String.range(of: "์ ๊ท ํํ์", option: [.regularExpression])
์์ String์ ํ์ ๋ฉ์๋๋ of: ์ ํด๋นํ๋ ์ ๊ท์์ ๋ง๋ ๋ฒ์๋ฅผ ๋ฆฌํดํฉ๋๋ค. ๋ง์ฝ ์ ๊ท ํํ์์ ํด๋นํ๋ ๊ฒ์ด ์๋ค๋ฉด nil์ ๋ฆฌํดํ๋ฏ๋ก if let ๊ตฌ๋ฌธ์ ์ด์ฉํ์ฌ ๋ฒ์๋ฅผ ๊ตฌํฉ๋๋ค. ๋ฐ๋ผ์ ํ์ผ๋ช ์ HEAD์ ๋ฒ์๋ ์ซ์๊ฐ ์๋ ์๊ฐ ๋ฑ์ฅํ ๋๊น์ง์ ๋ฒ์๊ฐ ๋ฉ๋๋ค.
๊ทธ๋ผ HEAD๋ถ๋ถ์ ์ ์ธํ๊ณ ์ซ์๊ฐ ๋ฑ์ฅํ๋ ๋ถ๋ถ์ ๋ฒ์๋ฅผ ๊ตฌํ์ฌ NUMBER๋ฅผ ๊ตฌํ ์ ์์ต๋๋ค.
์ ๊ท ํํ์์ ๊ตฌ๊ธ์ ๊ฒ์ํ๋ฉด ์์ธํ๊ฒ ์ค๋ช ์ด ๋์ด์์ต๋๋ค. ์๋ ์์ด ๋ง๊ณ ๋ฐฉ๋ํด์ ํด๋น ๊ธ์์ ์ค๋ช ํ์ง ๋ชปํ์ง๋ง ์ฐธ๊ณ ํ์ ์ ์ตํ๋์๋ฉด ๋ฌธ์์ด์ ์กฐ์ํ๋ ๋ฌธ์ ์์ ๋์ฑ ๊ฐ๋จํ ํด๊ฒฐ๋ฒ์ ์ฐพ์ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
String.drop() -> drop์์ ์กฐ๊ฑด์์ ๋ง์กฑํ๋ ๋ถ๋ถ์ ์ญ์ ํ๊ณ ๋๋จธ์ง ๋ถ๋ถ์ ๋ฆฌํดํฉ๋๋ค.
String.prefix() -> ์กฐ๊ฑด์์ ๋ง์กฑํ๋ ์ฒซ๋ฒ์งธ ์์๋ฅผ ๋ฆฌํดํฉ๋๋ค.
๋ค์์ Range, drop๊ณผ prefix๋ฅผ ์ด์ฉํ์ฌ HEAD์ NUMBER๋ฅผ ๊ตฌํด๋ณด๊ฒ ์ต๋๋ค.
prefix๋ฅผ ์ด์ฉํ์ฌ ์ซ์๋ฅผ ํฌํจํ์ง ์๋ ๋ถ๋ถ์ ๊ตฌํ์ฌ HEAD๋ฅผ ๊ตฌํ๊ณ , drop์ ์ด์ฉํ์ฌ HEAD๋ฅผ ์ง์ฐ๊ณ ๋ค์ prefix๋ฅผ ์ด์ฉํ์ฌ NUMBER๋ฅผ ๊ตฌํ๋ ๋ฐฉ์์ ๋๋ค.
๋๋จธ์ง ๊ณผ์ ์ ๋๊ฐ์ด (HEAD, NUMBER, ์ ๋ ฅ์์) ์ด ์ธ ๊ฐ์ง๋ฅผ ๋น๊ตํ์ฌ ์ ๋ ฌํ๋ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๐๐ป ์ฐธ๊ณ
- ํ๋ก๊ทธ๋๋จธ์ค - ๋์ ํ์ด
'๐ง๐ปโ๐ป iOS ๊ฐ๋ฐ > Swift - Algorithm - Solutions' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift - ํ๋ก๊ทธ๋๋จธ์ค] [3์ฐจ] ๋ฐฉ๊ธ๊ทธ๊ณก (0) | 2021.05.27 |
---|---|
[Swift - ํ๋ก๊ทธ๋๋จธ์ค] [3์ฐจ] n์ง์ ๊ฒ์ (0) | 2021.05.27 |
[Swift - ํ๋ก๊ทธ๋๋จธ์ค] ๊ฐ์ฅ ํฐ ์ ์ฌ๊ฐํ ์ฐพ๊ธฐ (0) | 2021.05.22 |
[Swift - ํ๋ก๊ทธ๋๋จธ์ค] N๊ฐ์ ์ต์๊ณต๋ฐฐ์ ๊ตฌํ๊ธฐ (0) | 2021.05.20 |
[Swift - ํ๋ก๊ทธ๋๋จธ์ค] ๋ฐฐ๋ฌ (0) | 2021.05.19 |