Skip to content

๐Ÿƒ๐Ÿป ๊ธฐ์ˆ ์  ๋„์ „

Wonbi edited this page Oct 7, 2022 · 1 revision

๐Ÿƒ๐Ÿป ๊ธฐ์ˆ ์  ๋„์ „

โš™๏ธ ๋‹จ๋ฐฉํ–ฅ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(Linked List) ์‚ฌ์šฉ

struct LinkedList<T: CalculateItem> {
    class Node<T: CalculateItem> {
        fileprivate var value: T
        fileprivate var next: Node?
        
        fileprivate init(_ value: T, next: Node? = nil) {
            self.value = value
            self.next = next
        }
    }
    
    private(set) var head: Node<T>?
    private(set) var nodeCount: Int = 0
    
    mutating func removeFirst() -> T? {
        let value = head?.value
        
        head = head?.next
        nodeCount -= 1
        
        return value
    }
    
    mutating func removeAll() {
        head = nil
        nodeCount = 0
    }
}

CalculatorItemQueue์—์„œ dequeue๋ฅผ ์‹คํ–‰ํ•  ๊ฒฝ์šฐ

  • ์ด๋ฅผ ๋ฐฐ์—ด๋กœ ๊ตฌํ˜„ํ•  ๊ฒฝ์šฐ Array์˜ ๊ธฐ๋ณธ ๋ฉ”์„œ๋“œ์ธ removeFirst()๋ฅผ ์‚ฌ์šฉํ•ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ฉ”์„œ๋“œ๋Š” 0๋ฒˆ index ๊ฐ’์„ ์ง€์šด ํ›„, ์ดํ›„ index์˜ ๊ฐ’์„ ๋ชจ๋‘ ํ•œ์นธ ์•ž์˜ index๋กœ ์˜ฎ๊ธฐ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•„์š”ํ•˜์—ฌ O(n)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ, ์ด๋ฅผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ, head์— head?.next๊ฐ’์„ ๋ถ€์—ฌํ•ด์ฃผ๋ฉด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์™„๋ฃŒ๋˜๊ธฐ ๋•Œ๋ฌธ์— O(1)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

CalculatorItemQueue์˜ ๋ชจ๋“  ๊ฐ’์„ ์ง€์šฐ๋Š” ๊ฒฝ์šฐ

  • ์ด๋ฅผ ๋ฐฐ์—ด๋กœ ๊ตฌํ˜„ํ•  ๊ฒฝ์šฐ ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ๊ฐ’์— ๋Œ€ํ•ด ์•ž์˜ index ๊ฐ’์„ ์ง€์šด ํ›„, ์ดํ›„ index์˜ ๊ฐ’์„ ๋ชจ๋‘ ํ•œ์นธ ์•ž์˜ index๋กœ ์˜ฎ๊ฒจ์ค€ ํ›„์— ์‚ญ์ œํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•„์š”ํ•˜์—ฌ O(n)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ, ์ด๋ฅผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ฆฌ์ŠคํŠธ ๋‚ด์˜ head์— nil์„ ๋ถ€์—ฌํ•ด์ฃผ๋ฉด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์™„๋ฃŒ๋˜๊ธฐ ๋•Œ๋ฌธ์— O(1)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

  • ์ด๋Ÿฐ ์„ฑ๋Šฅ์ ์ธ ์ด์ ์„ ์ฑ™๊ธธ ์ˆ˜ ์žˆ๋Š” ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.





โš™๏ธ ์ œ๋„ค๋ฆญ์˜ ์‚ฌ์šฉ

protocol CalculateItem { }

struct CalculatorItemQueue<T: CalculateItem> {
    private var list: LinkedList<T> = LinkedList<T>()
    
    ...
}
  • ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋Š” Queue์— ์‚ฌ์šฉ์ž๋กœ ๋ถ€ํ„ฐ ์ž…๋ ฅ๋ฐ›์€ ์—ฐ์‚ฐ์ž์™€ ํ”ผ์—ฐ์‚ฐ์ž๋ฅผ ๋‹ด์•„์„œ ๊ณ„์‚ฐ ์ˆ˜์‹์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์„ ๊ตฌํ˜„ํ•ด์•ผ๋งŒ ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ทธ ๊ณผ์ •์—์„œ Queue์— ๋‹ด๊ธฐ๋Š” ์š”์†Œ๋Š” CalculateItemํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๋Š” ํƒ€์ž…๋งŒ ๋‹ด์•„์ง€๋„๋ก ์ œํ•œํ•˜๋Š” ์กฐ๊ฑด์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ์œ„ํ•ด Queue๊ฐ€ ์ œ๋„ค๋ฆญ ํƒ€์ž…์„ ๊ฐ€์ง€๋„๋กํ•˜๊ณ , ๊ทธ ์ œ๋„ค๋ฆญ ํƒ€์ž…์ด CalculateItemํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜์—ฌ Queue์— ๋‹ด๊ธธ ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์ด ์ œํ•œ๋˜๋„๋ก ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.





โš™๏ธ TDD

import XCTest
@testable import Calculator

final class FormulaTests: XCTestCase {
    var sut: Formula!
    
    override func setUpWithError() throws {
        try super.setUpWithError()
        let operands = CalculatorItemQueue<Double>()
        let operators = CalculatorItemQueue<Operator>()
        
        sut = Formula(operands: operands, operators: operators)
    }

    override func tearDownWithError() throws {
        try super.tearDownWithError()
        sut = nil
    }
    
    func test_0๋‚˜๋ˆ„๊ธฐ0์„์ง„ํ–‰ํ•˜๋ฉด_NaN์„๋ฐ˜ํ™˜ํ•˜๋Š”์ง€() {
        sut.operands.enqueue(0.0)
        sut.operators.enqueue(Operator.divide)
        sut.operands.enqueue(0.0)
        
        let result = sut.result()
        
        XCTAssertTrue(result.isNaN)
    }
}
  • TDD๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์งœ๋ณด๋ผ๋Š” ์š”๊ตฌ์‚ฌํ•ญ์„ ์ง„ํ–‰ํ•˜๊ณ ์ž ํ–ˆ์œผ๋‚˜, ์ต์ˆ™ํ•˜์ง€ ์•Š์•„ ์„ ๋œป ์†์ด ๊ฐ€์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ, ์•„๋ž˜์™€ ๊ฐ™์€ ์ˆœ์„œ๋กœ ์ง„ํ–‰ํ•˜๊ณ ์ž ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
    • ์š”๊ตฌ์‚ฌํ•ญ์„ ๋งŒ์กฑํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•œ์ง€๋ฅผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
    • ๊ทธ ํ…Œ์ŠคํŠธ๋ฅผ ๋จผ์ € ๊ตฌํ˜„ํ•œ ๋‹ค์Œ, ๊ทธ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฌผ๋ก  ํ•ด๋‹น ๊ณผ์ •์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ๋‹ค์‹œ ๊ณ ์น˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๊ธฐ๋„ ํ•˜๊ณ , ์ฝ”๋“œ๋ฅผ ๋จผ์ € ๊ตฌํ˜„ํ•˜๊ณ  ๊ทธ์— ๋งž๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ๋‹ค์‹œ ๊ตฌํ˜„ํ•˜๋Š” ๋“ฑ, ์ˆœ์„œ๊ฐ€ ์ž˜ ์ง€์ผœ์ง€์ง€ ์•Š์•˜์ง€๋งŒ, ์ด๋Š” ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์  ๋„์ „์—์„œ ๊ฒช๋Š” ์‹œํ–‰์ฐฉ์˜ค๋ผ ์ƒ๊ฐํ–ˆ๊ณ  ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋งŽ์€ ๊ฒฝํ—˜์„ ํ†ตํ•ด ์ต์ˆ™ํ•ด์ง€๋Š” ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•˜์˜€์Šต๋‹ˆ๋‹ค.