Swift Data Structure And Algorithm/String Algorithm

ํฐ ์ž๋ฆฟ์ˆ˜ ๋บ„์…ˆ

youngjaeLee1026 2022. 3. 10. 19:08

1. ๋ฌธ์ œ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-03-10 19 05 40

2. ์ž…์ถœ๋ ฅ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-03-10 19 05 56

3. ์ž…์ถœ๋ ฅ ์˜ˆ์‹œ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-03-10 19 06 09

4. ๋ฌธ์ œ ์„ค๊ณ„

  1. Swift์˜ ๊ฒฝ์šฐ ๊ธฐ๋ณธ Integer ์ž๋ฃŒํ˜•์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋Š” 21์–ต์ด๋ฏ€๋กœ 10^100 ์ˆซ์ž๋ฅผ ๋‹ด์„ ์ˆ˜ ์—†์Œ
  2. ๋”ฐ๋ผ์„œ ๋ฐฐ์—ด์— ๊ฐ ์ž๋ฆฟ์ˆ˜๋ฅผ ๋‹ด๊ณ , ์—ฐ์‚ฐ์„ ์ง„ํ–‰ํ•˜๊ณ  ๋ฌธ์ž์—ด์— ์ €์žฅํ•จ์œผ๋กœ์จ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ
  3. ๋จผ์ € ๋” ํฐ ์ˆซ์ž๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๊ธธ์ด๋ฅผ ํ†ตํ•ด ํŒŒ์•…ํ•˜๊ณ , ๊ธธ์ด๊ฐ€ ๊ฐ™๋‹ค๋ฉด ๊ฐ ์ž๋ฆฌ์ˆ˜๋ฅผ ๋น„๊ตํ•จ์œผ๋กœ์จ ๋” ํฐ ์ˆซ์ž๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Œ.
  4. ๊ทธ ํ›„, ๊ฐ ์ˆซ์ž์— ํ•ด๋‹นํ•˜๋Š” ๋ฐฐ์—ด์— ์ˆซ์ž๋ฅผ ๊ฐ ์ž๋ฆฟ์ˆ˜ ๋งˆ๋‹ค ๋‹ด์Œ
  5. ๋บ„์…ˆ ์—ฐ์‚ฐ์„ ๋บ„์…ˆ ๋ฐฐ์—ด์— ์ €์žฅ ํ›„, ๋‘ ๋ฒˆ์งธ๋กœ ์ž…๋ ฅ๋ฐ›์€ ์ˆซ์ž๊ฐ€ ๋” ํฐ ๊ฒฝ์šฐ ์Œ์ˆ˜ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ณ , ๊ฒฐ๊ณผ๊ฐ€ 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()

 

์ „์ฒด์ฝ”๋“œ๋Š” ์—ฌ๊ธฐ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.