λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ’» Programming 개발/🍎 iOS 개발, Swift

[Swift][λ²ˆμ—­] μŠ€μœ„ν”„νŠΈμ˜ μžλ£Œκ΅¬μ‘°μ™€ μ•Œκ³ λ¦¬μ¦˜ - μ„Ήμ…˜ 2. 기초 자료ꡬ쑰 - 챕터4~5. μŠ€νƒ, μŠ€νƒ λ„μ „κ³Όμ œ

by kimdee 2022. 5. 23.
λ°˜μ‘ν˜•

 

[Swift][λ²ˆμ—­] μŠ€μœ„ν”„νŠΈμ˜ μžλ£Œκ΅¬μ‘°μ™€ μ•Œκ³ λ¦¬μ¦˜ - μ„Ήμ…˜ 2. κΈ°μ΄ˆ μžλ£Œκ΅¬μ‘° - μ±•ν„°4~5. μŠ€νƒ, μŠ€νƒ λ„μ „κ³Όμ œ

Raywenderlich.com μ—μ„œ λ‚˜μ˜¨ Data Structures & Algorithms in Swift μ±…μ˜ 데λͺ¨ κ³΅κ°œλ³Έμ„ λ²ˆμ—­ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 즐겁게 λ΄μ£Όμ„Έμš”. 

https://www.raywenderlich.com/books/data-structures-algorithms-in-swift

 

 

 


 

μ„Ήμ…˜ 2. 기초 자료ꡬ쑰 Elementary Data Structure

챕터 4. μŠ€νƒ Stacks 

μŠ€νƒμ€ μ–΄λŠ 곳에도 μžˆμŠ΅λ‹ˆλ‹€. μŠ€νƒμ΄ μžˆλŠ” 일반적인 μ˜ˆμ‹œλ₯Ό λ“€μ–΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

  • νŒ¬μΌ€μ΅
  • μ±…λ“€
  • 쒅이
  • 지폐

μŠ€νƒ stack μžλ£Œκ΅¬μ‘°λŠ” κ°œλ…μ μœΌλ‘œ 객체의 물리적 μŠ€νƒκ³Ό λ™μΌν•©λ‹ˆλ‹€. μ–΄λ–€ ν•­λͺ©μ„ μŠ€νƒμ— λ„£μœΌλ©΄ μŠ€νƒμ˜ 맨 μœ„μ— λ†“μ΄κ²Œ λ©λ‹ˆλ‹€. μŠ€νƒμ˜ μ–΄λ–€ ν•­λͺ©μ„ μ œκ±°ν•œλ‹€λ©΄ 항상 κ°€μž₯ μœ„μ— μžˆλŠ” ν•­λͺ©μ΄ μ œκ±°λ©λ‹ˆλ‹€.

쒋은 μ†Œμ‹: νŒ¬μΌ€μ΄ν¬κ°€ μŒ“μΈ μŠ€νƒ, λ‚˜μœ μ†Œμ‹: κ°€μž₯ μœ„μ— μžˆλŠ” νŒ¬μΌ€μ΄ν¬λ§Œ 먹을 수 μžˆλ‹€λŠ” 것.

 


 

μŠ€νƒμ˜ μž‘μ—… Stack operations

μŠ€νƒμ€ μœ μš©ν•˜κ³  또 λ„ˆλ¬΄λ‚˜ κ°„λ‹¨ν•©λ‹ˆλ‹€. μŠ€νƒμ„ κ΅¬μΆ•ν•˜λŠ” μ£Όμš” λͺ©ν‘œλŠ” 데이터λ₯Ό μ ‘κ·Όν•˜λŠ” 방법을 μ μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

μŠ€νƒμ—λŠ” 두 κ°€μ§€μ˜ ν•„μˆ˜ μž‘μ—…λ§Œ μžˆμŠ΅λ‹ˆλ‹€.

  • ν‘Έμ‹œ push: μŠ€νƒμ˜ μ΅œμƒλ‹¨μ— μš”μ†Œ μΆ”κ°€ν•˜κΈ°
  • 팝 pop: μŠ€νƒμ˜ μ΅œμƒλ‹¨ μš”μ†Œλ₯Ό μ œκ±°ν•˜κΈ°

μΈν„°νŽ˜μ΄μŠ€λ₯Ό 이 두가지 μž‘μ—…μœΌλ‘œ μ œν•œν•˜λŠ” 것은 자료ꡬ쑰의 ν•œ λ°©ν–₯μ—μ„œλ§Œ μΆ”κ°€ν•˜κ±°λ‚˜ μ œκ±°ν•  수 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 컴퓨터 κ³Όν•™μ—μ„œ μŠ€νƒμ€ LIFO(ν›„μž…μ„ μΆœ) μžλ£Œκ΅¬μ‘°λ‘œλ„ μ•Œλ €μ Έ μžˆμŠ΅λ‹ˆλ‹€. κ°€μž₯ λ§ˆμ§€λ§‰μ— ν‘Έμ‹œPush 된 μš”μ†Œκ°€ κ°€μž₯ λ¨Όμ € 팝Pop λ˜μ–΄ λ‚˜κ°€μ§‘λ‹ˆλ‹€.

μŠ€νƒμ€ ν”„λ‘œκ·Έλž˜λ° μ „ λΆ„μ•Όμ—μ„œ λ‘λ“œλŸ¬μ§€κ²Œ μ‚¬μš©λ©λ‹ˆλ‹€. λͺ‡ 가지λ₯Ό λ‚˜μ—΄ν•˜μžλ©΄,

  • iOSλŠ” λ„€λΉ„κ²Œμ΄μ…˜ μŠ€νƒμ„ μ‚¬μš©ν•˜μ—¬ 뷰컨트둀러λ₯Ό λ·° μ•ˆνŒŽμœΌλ‘œ ν‘Έμ‹œν•˜κ±°λ‚˜ νŒν•©λ‹ˆλ‹€.
  • λ©”λͺ¨λ¦¬ 할당은 μ•„ν‚€ν…μ²˜λ ˆλ²¨μ—μ„œ μŠ€νƒμ„ μ‚¬μš©ν•©λ‹ˆλ‹€. μ§€μ—­λ³€μˆ˜λ₯Ό μ €μž₯ν•˜λŠ” λ©”λͺ¨λ¦¬λ„ μŠ€νƒμ„ μ‚¬μš©ν•˜μ—¬ κ΄€λ¦¬ν•©λ‹ˆλ‹€.
  • λ―Έλ‘œμ—μ„œ 길을 μ°ΎλŠ” 것과 같은 λΆ„ν•  정볡 μ•Œκ³ λ¦¬μ¦˜(Search and conquer algorithms)μ—μ„œ μŠ€νƒμ„ μ‚¬μš©ν•˜μ—¬ 역좔적을 νŽΈλ¦¬ν•˜κ²Œ ν•©λ‹ˆλ‹€.

κ΅¬ν˜„ Implementation

이 μ±•ν„°μ˜ μŠ€νƒ€ν„° ν”Œλ ˆμ΄κ·ΈλΌμš΄λ“œλ₯Ό μ—΄κ³ , ν”Œλ ˆμ΄κ·ΈλΌμš΄λ“œμ˜ Source 폴더에 Stack.swift λΌλŠ” νŒŒμΌμ„ λ§Œλ“­λ‹ˆλ‹€. 파일 μ•ˆμ— μ•„λž˜ μ½”λ“œλ₯Ό μž‘μ„±ν•©λ‹ˆλ‹€.

 

public struct Stack<Element> {

  private var storage: [Element] = []

  public init() { }
}

extension Stack: CustomDebugStringConvertible {

  public var debugDescription: String {
    """
    ----top----
    \(storage.map { "\($0)" }.reversed().joined(separator: "\n"))
    -----------
    """
  }
}

 

μœ„μ— μŠ€νƒμ˜ λ°±μ—… μŠ€ν† λ¦¬μ§€(backing storage)λ₯Ό μ •μ˜ν•˜μ˜€μŠ΅λ‹ˆλ‹€. μŠ€νƒμ— μ ν•©ν•œ μŠ€ν† λ¦¬μ§€ μœ ν˜•μ„ μ„ νƒν•˜λŠ” 것은 맀우 μ€‘μš”ν•©λ‹ˆλ‹€. 배열은 append 와 popLast λ₯Ό μ΄μš©ν•˜μ—¬ ν•œμͺ½ λμ—μ„œ μƒμˆ˜μ‹œκ°„μ˜ μ‚½μž…κ³Ό μ‚­μ œκ°€ μ΄λ£¨μ–΄μ§€λ―€λ‘œ ν™•μ‹€ν•œ μ„ νƒμž…λ‹ˆλ‹€. 이 두 가지 μž‘μ—…μ„ μ‚¬μš©ν•˜λ©΄ μŠ€νƒμ˜ ν›„μž…μ„ μΆœ νŠΉμ„±μ΄ λ”μš± μš©μ΄ν•΄μ§‘λ‹ˆλ‹€.

CustomDebugStringConvertible ν”„λ‘œν† μ½œμ— ν•„μš”ν•œ debugDescription 의 ν•¨μˆ˜ 호좜 체인을 μœ„ν•΄μ„œ 3가지 μž‘μ—…μ„ ν•΄μ•Όν•©λ‹ˆλ‹€.

  1. storage.map { "\\($0)" } 둜 λ¬Έμžμ—΄μ— λ§€ν•‘ν•˜λŠ” λ°°μ—΄ λ§Œλ“€κΈ°
  2. reversed() λ₯Ό μ΄μš©ν•˜μ—¬ 이전 배열을 λ’€μ§‘λŠ” μƒˆλ‘œμš΄ 배열을 λ§Œλ“€κΈ°
  3. joined(separator:) λ₯Ό μ΄μš©ν•˜μ—¬ 배열을 λ¬Έμžμ—΄λ‘œ 병합. "\\n" κ°œν–‰λ¬Έμžλ₯Ό μ΄μš©ν•˜μ—¬ λ°°μ—΄μ˜ μš”μ†Œλ₯Ό 뢄리

μ΄λ ‡κ²Œ ν•΄μ„œ 디버깅에 μ‚¬μš©ν•  수 μžˆλŠ” 좜λ ₯κ°€λŠ₯ν•œ Stack νƒ€μž…μ˜ ν‘œν˜„μ΄ μƒμ„±λ©λ‹ˆλ‹€.

 

ν‘Έμ‹œμ™€ 팝 μž‘μ—… push and pop operations

Stack에 μ•„λž˜ 두가지 μž‘μ—…μ„ μΆ”κ°€ν•˜μ„Έμš”

 

public mutating func push(_ element: Element) {
  storage.append(element)
}

@discardableResult
public mutating func pop() -> Element? {
  storage.popLast()
}

맀우 κ°„λ‹¨ν•˜μ£ ! ν”Œλ ˆμ΄κ·ΈλΌμš΄λ“œμ—μ„œ μ•„λž˜ μ½”λ“œλ₯Ό μž‘μ„±ν•©λ‹ˆλ‹€.

 

example(of: "using a stack") {
  var stack = Stack<Int>()
  stack.push(1)
  stack.push(2)
  stack.push(3)
  stack.push(4)

  print(stack)

  if let poppedElement = stack.pop() {
    assert(4 == poppedElement)
    print("Popped: \(poppedElement)")
  }
}

μ•„λž˜μ™€ 같이 좜λ ₯λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

 

---Example of using a stack---
----top----
4
3
2
1
-----------
Popped: 4

push μ™€ pop μ€ λ‘˜ λ‹€ μ‹œκ°„λ³΅μž‘λ„κ°€ O(1) μž…λ‹ˆλ‹€.

 

λΉ„ν•„μˆ˜ μž‘μ—… Non-essential operations

μŠ€νƒμ„ 더 μ‰½κ²Œ μ‚¬μš©ν•  수 μžˆλŠ” μœ μš©ν•œ μž‘μ—…λ“€μ΄ μžˆμŠ΅λ‹ˆλ‹€.  Stack.swift μ•ˆμ— μ•„λž˜ μ½”λ“œλ₯Ό Stack에 μΆ”κ°€ν•˜μ„Έμš”.

 

public func peek() -> Element? {
 storage.last
}

public var isEmpty: Bool {
  peek() == nil
}

μŠ€νƒ μΈν„°νŽ˜μ΄μŠ€μ—λŠ” μ’…μ’… peek μž‘μ—…μ΄ ν¬ν•¨λ©λ‹ˆλ‹€. peek 은 μ•ˆμ˜ μ½˜ν…μΈ λ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³  μŠ€νƒμ˜ 상단 μš”μ†Œλ₯Ό μ‚΄νŽ΄λ³΄λŠ” κ²ƒμž…λ‹ˆλ‹€.

 

 

μ μ„μˆ˜λ‘ μ’‹μŠ΅λ‹ˆλ‹€ Less is more

μŠ€νƒμ— μŠ€μœ„ν”„νŠΈ μ½œλ ‰μ…˜ ν”„λ‘œν† μ½œμ„ μ μš©ν•  수 μžˆμ„μ§€ κΆκΈˆν•  κ²ƒμž…λ‹ˆλ‹€. μŠ€νƒμ˜ λͺ©μ μ€ 데이터에 μ ‘κ·Όν•˜λŠ” λ°©λ²•μ˜ κ°€μ§“μˆ˜λ₯Ό μ œν•œν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. Collection κ³Ό 같은 ν”„λ‘œν† μ½œμ„ μ±„νƒν•˜λŠ” 것은 반볡자(iterator)와 μ•„λž˜μ²¨μž(subscript)λ₯Ό 톡해 λͺ¨λ“  μš”μ†Œλ₯Ό λ…ΈμΆœν•˜λ―€λ‘œ μŠ€νƒμ˜ λͺ©μ μ— λ°˜ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 이 κ²½μš°μ—λŠ” 더 적은 것이 μ’‹μŠ΅λ‹ˆλ‹€.

 

μ ‘κ·Ό μˆœμ„œλ₯Ό 보μž₯ν•˜κΈ° μœ„ν•΄ 기쑴의 배열을 μ·¨ν•΄μ„œ μŠ€νƒμœΌλ‘œ λ³€ν™˜ν•˜κ³  싢을 수 μžˆμŠ΅λ‹ˆλ‹€. λ‹Ήμ—°νžˆ λͺ¨λ“  λ°°μ—΄ μš”μ†Œλ₯Ό λ°˜λ³΅ν•˜μ—¬ 각 μš”μ†Œλ₯Ό push ν•˜λŠ” 것은 κ°€λŠ₯ν•©λ‹ˆλ‹€.

 

 private μ €μž₯μ†Œλ₯Ό μ„€μ •ν•˜λŠ” μƒμ„±μžλ₯Ό μž‘μ„±ν•  수 μžˆμœΌλ―€λ‘œ, μ•„λž˜ μ½”λ“œλ₯Ό μŠ€νƒ κ΅¬ν˜„μ— μΆ”κ°€ν•©λ‹ˆλ‹€.

 

public init(_ elements: [Element]) {
  storage = elements
}

 

μ•„λž˜ 예제λ₯Ό 메인 ν”Œλ ˆμ΄κ·ΈλΌμš΄λ“œμ— μΆ”κ°€ν•©λ‹ˆλ‹€.

 

example(of: "initializing a stack from an array") {
  let array = ["A", "B", "C", "D"]
  var stack = Stack(array)
  print(stack)
  stack.pop()
}

 

μœ„ μ½”λ“œλŠ” λ¬Έμžμ—΄ μŠ€νƒμ„ μƒμ„±ν•˜κ³  μ΅œμƒλ‹¨ μš”μ†Œ “D”λ₯Ό λ‚΄λ³΄λƒ…λ‹ˆλ‹€. μŠ€μœ„ν”„νŠΈ μ»΄νŒŒμΌλŸ¬λŠ” λ°°μ—΄λ‘œλΆ€ν„° μš”μ†Œμ˜ νƒ€μž…μ„ μΆ”λ‘ ν•  수 μžˆμœΌλ―€λ‘œ Stack<String> λŒ€μ‹ μ— Stack 을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

ν•œ 단계 더 λ‚˜μ•„κ°€ λ°°μ—΄ λ¦¬ν„°λŸ΄μ„ 톡해 μŠ€νƒμ„ μ΄ˆκΈ°ν™”ν•  수 μžˆλ„λ‘ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€. μ•„λž˜λ₯Ό μŠ€νƒ κ΅¬ν˜„ μ‹œ μΆ”κ°€ν•˜μ„Έμš”.

 

extension Stack: ExpressibleByArrayLiteral {
  public init(arrayLiteral elements: Element...) {
    storage = elements
  }
}

메인 ν”Œλ ˆμ΄κ·ΈλΌμš΄λ“œλ‘œ λŒμ•„κ°€ μ•„λž˜ μ½”λ“œλ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.

 

example(of: "initializing a stack from an array literal") {
  var stack: Stack = [1.0, 2.0, 3.0, 4.0]
  print(stack)
  stack.pop()
}

μœ„ μ½”λ“œλŠ” Double μŠ€νƒμ„ μƒμ„±ν•˜κ³  μ΅œμƒλ‹¨ κ°’ 4.0을 λ‚΄λ³΄λƒ…λ‹ˆλ‹€. λ‹€μ‹œ λ§ν•˜μžλ©΄ νƒ€μž…μΆ”λ‘ μ„ 톡해 Stack<Double> λ₯Ό μž…λ ₯ν•˜μ§€ μ•Šμ•„λ„ λ©λ‹ˆλ‹€.

 

μŠ€νƒμ€ νŠΈλ¦¬μ™€ κ·Έλž˜ν”„λ₯Ό 검색searchν•˜λŠ” λ¬Έμ œμ— 맀우 μ€‘μš”ν•©λ‹ˆλ‹€. λ―Έλ‘œμ—μ„œ 길을 μ°ΎλŠ” 것을 μƒμƒν•΄λ³΄μ„Έμš”. μ™Όμͺ½, 였λ₯Έμͺ½, 직진을 선택해야될 λ•Œλ§ˆλ‹€ ν•  수 μžˆλŠ” λͺ¨λ“  결정을 μŠ€νƒμ— μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 막닀λ₯Έ 골λͺ©μ— λ„λ‹¬ν•˜λ©΄ μŠ€νƒμ—μ„œ λ§ˆμ§€λ§‰ 결정을 내보냄(pop)으둜써 역좔적할 수 있고, λ‹€λ₯Έ 막닀λ₯Έ 골λͺ©μ— λ„λ‹¬ν•˜κ±°λ‚˜ νƒˆμΆœν•˜κΈ° μ „κΉŒμ§€ 이λ₯Ό 계속할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

 

핡심 μš”μ•½ Key points

  • μŠ€νƒμ€ LIFO, ν›„μž…μ„ μΆœ μžλ£Œκ΅¬μ‘°μ΄λ‹€.
  • 맀우 λ‹¨μˆœν•˜μ§€λ§Œ μŠ€νƒμ€ λ§Žμ€ λ¬Έμ œλ“€μ˜ 핡심 μžλ£Œκ΅¬μ‘°μ΄λ‹€.
  • μŠ€νƒμ˜ 두가지 ν•„μˆ˜ μž‘μ—…μœΌλ£Œ, μš”μ†Œλ₯Ό μΆ”κ°€ν•˜λŠ” push λ©”μ„œλ“œμ™€ μš”μ†Œλ₯Ό μ œκ±°ν•˜λŠ” pop λ©”μ„œλ“œκ°€ μžˆλ‹€.

 

 


챕터 5. μŠ€νƒ λ„μ „κ³Όμ œ Stack Challenges

μŠ€νƒμ€ λ†€λΌμšΈ μ •λ„λ‘œ λ§Žμ€ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μžˆλŠ” λ‹¨μˆœν•œ μžλ£Œκ΅¬μ‘°μž…λ‹ˆλ‹€.

starter ν”„λ‘œμ νŠΈλ₯Ό μ—΄μ–΄μ„œ μ•„λž˜ λ„μ „κ³Όμ œλ“€μ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

첫번째 λ„μ „κ³Όμ œ: λ°°μ—΄ λ°˜μ „ Reverse an Array

μŠ€νƒμ„ μ‚¬μš©ν•˜μ—¬ λ°°μ—΄μ˜ μš”μ†Œλ₯Ό μ—­μˆœμœΌλ‘œ 좜λ ₯ν•˜λŠ” ν•¨μˆ˜λ₯Ό λ§Œλ“œμ„Έμš”.

λ‘λ²ˆμ§Έ λ„μ „κ³Όμ œ: κ΄„ν˜Έ 짝 ν™•μΈν•˜κΈ° Balance the parentheses

κ΄„ν˜Έμ˜ 짝이 λ§žλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€. 주어진 λ¬Έμžμ—΄μ—μ„œ  ( μ™€ ) κ°€ μžˆλŠ”μ§€ ν™•μΈν•˜κ³ , 짝이 맞으면 true 을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

 

// 1
h((e))llo(world)() // balanced parentheses

// 2
(hello world // unbalanced parentheses

 

ν•΄κ²°μ±… Solutions

λ„μ „κ³Όμ œ 1 ν•΄κ²°μ±…

μŠ€νƒμ˜ μ£Ό 이용 사둀 쀑 ν•˜λ‚˜λŠ” 역좔적을 μš©μ΄ν•˜κ²Œ ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. κ°’λ“€μ˜ μ‹œν€€μŠ€λ₯Ό μŠ€νƒμ— ν‘Έμ‹œν•˜κ³ , 순차적으둜 νŒν•˜λ©΄ 값듀을 μ—­μˆœμœΌλ‘œ μ–»κ²Œλ©λ‹ˆλ‹€.

 

func printInReverse<T>(_ array: [T]) {
  var stack = Stack<T>()

  for value in array {
    stack.push(value)
  }

  while let value = stack.pop() {
    print(value)
  }
}

λ…Έλ“œλ₯Ό μŠ€νƒμ— ν‘Έμ‹œν•˜λ©΄ μ‹œκ°„λ³΅μž‘λ„λŠ” O(n) μž…λ‹ˆλ‹€. μŠ€νƒμ˜ μš”μ†Œλ₯Ό νŒν•˜μ—¬ 값을 좜λ ₯ν•˜λŠ” 것 μ—­μ‹œ O(n) μž…λ‹ˆλ‹€. μ΅œμ’…μ μœΌλ‘œ μœ„ μ•Œκ³ λ¦¬μ¦˜μ˜ μ‹œκ°„ λ³΅μž‘λ„λŠ” O(n) 이 λ©λ‹ˆλ‹€.

 

μŠ€νƒ μ»¨ν…Œμ΄λ„ˆλ₯Ό ν•¨μˆ˜ μ•ˆμ— ν• λ‹Ήν•˜μ˜€μœΌλ―€λ‘œ κ³΅κ°„λ³΅μž‘λ„ λΉ„μš©μœΌλ‘œλ„ O(n) 이 λ“­λ‹ˆλ‹€.

 

πŸ“Œ λ©”λͺ¨: ν‘œμ€€ λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ μ œκ³΅ν•˜λŠ” reversed() λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ 배열을 λ°˜μ „ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ°°μ—΄μ—μ„œ 이 λ©”μ„œλ“œλŠ” O(1) 의 μ‹œκ°„κ³Ό κ³΅κ°„λ³΅μž‘λ„μž…λ‹ˆλ‹€. μ™œλƒν•˜λ©΄ 원본 μ½œλ ‰μ…˜μ—μ„œ λ°˜μ „λœ 뷰만 μƒμ„±ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. λ§Œμ•½ μ•„μ΄ν…œμ„ μˆœνšŒν•˜κ³  λͺ¨λ“  μš”μ†Œλ₯Ό 좜λ ₯ν•˜λ©΄ μ‹œκ°„λ³΅μž‘λ„λŠ” O(n)이 되고 κ·Έ λ™μ•ˆ κ³΅κ°„λ³΅μž‘λ„λŠ” O(1)이 λ©λ‹ˆλ‹€.

 

λ„μ „κ³Όμ œ 2 ν•΄κ²°μ±…

λ¬Έμžμ—΄μ—μ„œ κ΄„ν˜Έμ˜ 짝이 λ§žλŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•΄μ„œ, λ¬Έμžμ—΄μ˜ 각 문자λ₯Ό 확인해야 ν•©λ‹ˆλ‹€. μ—¬λŠ” κ΄„ν˜Έλ₯Ό λ§Œλ‚˜λ©΄ μŠ€νƒμ— ν‘Έμ‹œν•˜κ³ , λ°˜λŒ€λ‘œ λ‹«λŠ” κ΄„ν˜Έλ₯Ό λ§Œλ‚˜λ©΄ μŠ€νƒμ„ νŒν•©λ‹ˆλ‹€.

 

μ½”λ“œλŠ” μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

 

func checkParentheses(_ string: String) -> Bool {
  var stack = Stack<Character>()

  for character in string {
    if character == "(" {
      stack.push(character)
    } else if character == ")" {
      if stack.isEmpty {
        return false
      } else {
        stack.pop()
      }
    }
  }
  return stack.isEmpty

 

μœ„ μ•Œκ³ λ¦¬μ¦˜μ˜ μ‹œκ°„λ³΅μž‘λ„λŠ” O(n) μž…λ‹ˆλ‹€. μ—¬κΈ°μ„œ n은 λ¬Έμžμ—΄ λ‚΄μ˜ 문자 κ°―μˆ˜μž…λ‹ˆλ‹€. 이 μ•Œκ³ λ¦¬μ¦˜μ€ Stack 자료ꡬ쑰의 μ‚¬μš©μœΌλ‘œ O(n) 의 κ³΅κ°„λ³΅μž‘λ„κ°€ λ°œμƒν•©λ‹ˆλ‹€.

 

 

 

 

 


πŸ”— λ²ˆμ—­ μ‹œλ¦¬μ¦ˆ 링크

0️⃣ μ„Ήμ…˜ 0. μ‹œμž‘ν•˜κΈ°μ „μ—

 

[Swift][λ²ˆμ—­] μŠ€μœ„ν”„νŠΈμ˜ μžλ£Œκ΅¬μ‘°μ™€ μ•Œκ³ λ¦¬μ¦˜ - μ„Ήμ…˜ 0. μ‹œμž‘ν•˜κΈ° 전에

μš”μ¦˜ μ•Œκ³ λ¦¬μ¦˜ 곡뢀λ₯Ό ν•˜λ©΄μ„œ Raywenderlich.com μ—μ„œ λ‚˜μ˜¨ Data Structures & Algorithms in Swift이 책을 보고 μžˆμŠ΅λ‹ˆλ‹€. https://www.raywenderlich.com/books/data-structures-algorithms-in-swift μ €λŠ” μ •..

kimdee.tistory.com

1️⃣ μ„Ήμ…˜ 1. μ†Œκ°œ Introduction

> 챕터 1.μ™œ μžλ£Œκ΅¬μ‘°μ™€ μ•Œκ³ λ¦¬μ¦˜μ„ λ°°μ›Œμ•Όν• κΉŒμš”? / μ±•ν„° 2. λ³΅μž‘λ„  Complexity

 

[Swift][λ²ˆμ—­] μŠ€μœ„ν”„νŠΈμ˜ μžλ£Œκ΅¬μ‘°μ™€ μ•Œκ³ λ¦¬μ¦˜ - μ„Ήμ…˜ 1. μ†Œκ°œ - 챕터1. μ™œ μžλ£Œκ΅¬μ‘°μ™€ μ•Œκ³ λ¦¬μ¦˜μ„

Raywenderlich.com μ—μ„œ λ‚˜μ˜¨ Data Structures & Algorithms in Swift μ±…μ˜ 데λͺ¨ κ³΅κ°œλ³Έμ„ λ²ˆμ—­ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 즐겁게 λ΄μ£Όμ„Έμš”. https://www.raywenderlich.com/books/data-structures-algorithms-in-swift μ„Ήμ…˜..

kimdee.tistory.com

> 챕터3. μŠ€μœ„ν”„νŠΈ ν‘œμ€€ 라이브러리 Swift Standard Library

 

[Swift][λ²ˆμ—­] μŠ€μœ„ν”„νŠΈμ˜ μžλ£Œκ΅¬μ‘°μ™€ μ•Œκ³ λ¦¬μ¦˜ - μ„Ήμ…˜ 1. μ†Œκ°œ - 챕터3. μŠ€μœ„ν”„νŠΈ ν‘œμ€€ 라이브러리 S

Raywenderlich.com μ—μ„œ λ‚˜μ˜¨ Data Structures & Algorithms in Swift μ±…μ˜ 데λͺ¨ κ³΅κ°œλ³Έμ„ λ²ˆμ—­ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 즐겁게 λ΄μ£Όμ„Έμš”. https://www.raywenderlich.com/books/data-structures-algorithms-in-swift μ„Ήμ…˜..

kimdee.tistory.com

 

1️⃣ μ„Ήμ…˜ 2. 기초 자료ꡬ쑰 Elementary Data Structure

> 챕터 4. μŠ€νƒ Stacks /  μ±•ν„° 5. μŠ€νƒ λ„μ „κ³Όμ œ Stack Challenges

 

[Swift][λ²ˆμ—­] μŠ€μœ„ν”„νŠΈμ˜ μžλ£Œκ΅¬μ‘°μ™€ μ•Œκ³ λ¦¬μ¦˜ - μ„Ήμ…˜ 2. 기초 자료ꡬ쑰 - 챕터4~5. μŠ€νƒ, μŠ€νƒ 도전

Raywenderlich.com μ—μ„œ λ‚˜μ˜¨ Data Structures & Algorithms in Swift μ±…μ˜ 데λͺ¨ κ³΅κ°œλ³Έμ„ λ²ˆμ—­ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 즐겁게 λ΄μ£Όμ„Έμš”. https://www.raywenderlich.com/books/data-structures-algorithms-in-swift μ„Ήμ…˜..

kimdee.tistory.com

> 챕터 6-1. μ—°κ²°λ¦¬μŠ€νŠΈ Linked List (μ—°κ²°λ¦¬μŠ€νŠΈ μ •μ˜, μš”μ†Œ μΆ”κ°€, μ‚­μ œ)

 

 

[Swift][λ²ˆμ—­] μŠ€μœ„ν”„νŠΈμ˜ μžλ£Œκ΅¬μ‘°μ™€ μ•Œκ³ λ¦¬μ¦˜ - μ„Ήμ…˜ 2. 기초 자료ꡬ쑰 - 챕터6-1. μ—°κ²°λ¦¬μŠ€νŠΈ (μ •

[Swift][λ²ˆμ—­] μŠ€μœ„ν”„νŠΈμ˜ μžλ£Œκ΅¬μ‘°μ™€ μ•Œκ³ λ¦¬μ¦˜ - μ„Ήμ…˜ 2. 기초 자료ꡬ쑰 - 챕터6-1. μ—°κ²°λ¦¬μŠ€νŠΈ Raywenderlich.com μ—μ„œ λ‚˜μ˜¨ Data Structures & Algorithms in Swift μ±…μ˜ 데λͺ¨ κ³΅κ°œλ³Έμ„ λ²ˆμ—­ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 즐겁..

kimdee.tistory.com

> 챕터 6-2. μ—°κ²°λ¦¬μŠ€νŠΈ Linked List (μŠ€μœ„ν”„νŠΈ ν‘œμ€€ 라이브러리의 μ½œλ ‰μ…˜ ν”„λ‘œν† μ½œ, 카우 Copy-On-Write,  λ°Έλ₯˜ μ‹œλ§¨ν‹±)

 

 

[Swift][λ²ˆμ—­] μŠ€μœ„ν”„νŠΈμ˜ μžλ£Œκ΅¬μ‘°μ™€ μ•Œκ³ λ¦¬μ¦˜ - μ„Ήμ…˜ 2. 기초 자료ꡬ쑰 - 챕터6-2. μ—°κ²°λ¦¬μŠ€νŠΈ

[Swift][λ²ˆμ—­] μŠ€μœ„ν”„νŠΈμ˜ μžλ£Œκ΅¬μ‘°μ™€ μ•Œκ³ λ¦¬μ¦˜ - μ„Ήμ…˜ 2. 기초 자료ꡬ쑰 - 챕터6-2. μ—°κ²°λ¦¬μŠ€νŠΈ (μŠ€μœ„ν”„νŠΈ μ½œλ ‰μ…˜ ν”„λ‘œν† μ½œ, λ°Έλ₯˜ μ‹œλ§¨ν‹±, COW(μΉ΄ν”Ό-온-라이트)) Raywenderlich.com μ—μ„œ λ‚˜μ˜¨ Data Structures &..

kimdee.tistory.com

 

> 챕터 7. μ—°κ²°λ¦¬μŠ€νŠΈ λ„μ „κ³Όμ œ Linked List Challenges

 

[Swift][λ²ˆμ—­] μŠ€μœ„ν”„νŠΈμ˜ μžλ£Œκ΅¬μ‘°μ™€ μ•Œκ³ λ¦¬μ¦˜ - μ„Ήμ…˜ 2. 기초 자료ꡬ쑰 - 챕터7. μ—°κ²°λ¦¬μŠ€νŠΈ 도전

[Swift][λ²ˆμ—­] μŠ€μœ„ν”„νŠΈμ˜ μžλ£Œκ΅¬μ‘°μ™€ μ•Œκ³ λ¦¬μ¦˜ - μ„Ήμ…˜ 2. 기초 자료ꡬ쑰 - 챕터7. μ—°κ²°λ¦¬μŠ€νŠΈ λ„μ „κ³Όμ œ Raywenderlich.com μ—μ„œ λ‚˜μ˜¨ Data Structures & Algorithms in Swift μ±…μ˜ 데λͺ¨ κ³΅κ°œλ³Έμ„ λ²ˆμ—­ν•˜μ˜€μŠ΅λ‹ˆλ‹€..

kimdee.tistory.com

 


마치며 

 

μ˜€λŠ˜λ„ μ½μ–΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.

 

κΆκΈˆν•œ 점이 μžˆλ‹€λ©΄ λŒ“κΈ€λ‘œ, 도움이 λ˜μ…¨λ‹€λ©΄ 곡감 λΆ€νƒλ“œλ¦½λ‹ˆλ‹€.

ν˜Ήμ‹œ μˆ˜μ •ν•˜κ±°λ‚˜ ν”Όλ“œλ°±ν•˜μ‹€  λ‚΄μš© μžˆλ‹€λ©΄ μ–Έμ œλ“  λŒ“κΈ€λ‘œ λΆ€νƒλ“œλ¦½λ‹ˆλ‹€.

 

κ°μ‚¬ν•©λ‹ˆλ‹€.

 

 

 

λ°˜μ‘ν˜•

λŒ“κΈ€