Swift Data Structure And Algorithm/String Algorithm
ํฐ ์๋ฆฟ์ ๋บ์
youngjaeLee1026
2022. 3. 10. 19:08
1. ๋ฌธ์
2. ์ ์ถ๋ ฅ
3. ์ ์ถ๋ ฅ ์์
4. ๋ฌธ์ ์ค๊ณ
- Swift์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ Integer ์๋ฃํ์ ์ต๋ ํฌ๊ธฐ๋ 21์ต์ด๋ฏ๋ก 10^100 ์ซ์๋ฅผ ๋ด์ ์ ์์
- ๋ฐ๋ผ์ ๋ฐฐ์ด์ ๊ฐ ์๋ฆฟ์๋ฅผ ๋ด๊ณ , ์ฐ์ฐ์ ์งํํ๊ณ ๋ฌธ์์ด์ ์ ์ฅํจ์ผ๋ก์จ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์
- ๋จผ์ ๋ ํฐ ์ซ์๊ฐ ๋ฌด์์ธ์ง ๊ธธ์ด๋ฅผ ํตํด ํ์ ํ๊ณ , ๊ธธ์ด๊ฐ ๊ฐ๋ค๋ฉด ๊ฐ ์๋ฆฌ์๋ฅผ ๋น๊ตํจ์ผ๋ก์จ ๋ ํฐ ์ซ์๋ฅผ ํ์ ํ ์ ์์.
- ๊ทธ ํ, ๊ฐ ์ซ์์ ํด๋นํ๋ ๋ฐฐ์ด์ ์ซ์๋ฅผ ๊ฐ ์๋ฆฟ์ ๋ง๋ค ๋ด์
- ๋บ์ ์ฐ์ฐ์ ๋บ์ ๋ฐฐ์ด์ ์ ์ฅ ํ, ๋ ๋ฒ์งธ๋ก ์ ๋ ฅ๋ฐ์ ์ซ์๊ฐ ๋ ํฐ ๊ฒฝ์ฐ ์์ ์ฒ๋ฆฌ๋ฅผ ํ๊ณ , ๊ฒฐ๊ณผ๊ฐ 0์ธ ๊ฒฝ์ฐ๋ฅผ ๋ฐ๋ก ์์ธ์ฒ๋ฆฌํจ์ผ๋ก์จ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํจ
5. ์ ์ฒด ์ฝ๋
//
// main.swift
// BigNumberSubtraction
//
// Created by ์ด์์ฌ on 2022/03/10.
//MARK: - ํฐ ์๋ฆฟ์ ๋บ์
//MARK: - Framework
import Foundation
//MARK: - Function
func solution() -> Void {
//MARK: - Input
guard let A: String = readLine() else { return }
guard let B: String = readLine() else { return }
var answer: String = ""
var smallNumberIndex: Int = 0
var zeroCount: Int = 0
var flag: Bool = false
var sub: [Int] = []
var bigNumber: [Int] = []
var smallNumber: [Int] = []
//MARK: - Process
if A.count < B.count {
flag = true
} else if A.count > B.count {
flag = false
} else {
for i in 0..<B.count {
if A[A.index(A.startIndex, offsetBy: i)] < B[B.index(B.startIndex, offsetBy: i)] {
flag = true
break
}
}
}
if flag {
sub = Array(repeating: 0, count: B.count)
bigNumber = Array(repeating: 0, count: B.count)
smallNumber = Array(repeating: 0, count: B.count)
answer += "-" //B๊ฐ ๋ ํฐ ๊ฒฝ์ฐ์๋ ์์์ฒ๋ฆฌ
for i in stride(from: B.count - 1, through: 0, by: -1) {
bigNumber[i] = Int(B[B.index(B.startIndex, offsetBy: i)].asciiValue! - 48)
}
smallNumberIndex = A.count - 1
for i in stride(from: B.count - 1, through: B.count - A.count, by: -1) {
smallNumber[i] = Int(A[A.index(A.startIndex, offsetBy: smallNumberIndex)].asciiValue! - 48)
smallNumberIndex -= 1
}
for i in 0..<B.count {
sub[i] = bigNumber[i] - smallNumber[i]
}
} else {
sub = Array(repeating: 0, count: A.count)
bigNumber = Array(repeating: 0, count: A.count)
smallNumber = Array(repeating: 0, count: A.count)
for i in stride(from: A.count - 1, through: 0, by: -1) {
bigNumber[i] = Int(A[A.index(A.startIndex, offsetBy: i)].asciiValue! - 48)
}
smallNumberIndex = B.count - 1
for i in stride(from: A.count - 1, through: A.count - B.count, by: -1) {
smallNumber[i] = Int(B[B.index(B.startIndex, offsetBy: smallNumberIndex)].asciiValue! - 48)
smallNumberIndex -= 1
}
for i in 0..<A.count {
sub[i] = bigNumber[i] - smallNumber[i]
}
}
for i in stride(from: sub.count - 1, to: 0, by: -1) {
if sub[i] < 0 {
sub[i - 1] -= 1
sub[i] += 10
}
}
//์ 0์ฒ๋ฆฌ
for number in sub {
if number > 0 {
break
}
zeroCount += 1
}
if zeroCount == 1 {
answer += "\(0)"
} else {
for i in zeroCount..<sub.count {
answer += "\(sub[i])"
}
}
//MARK: - Output
print(answer)
}
solution()
์ ์ฒด์ฝ๋๋ ์ฌ๊ธฐ์์ ํ์ธํ ์ ์์ต๋๋ค.