[Swift] Struct와 Class 차이점 & 스택 만들기(BOJ 1874)

hye0n.gyu·2023년 5월 7일

Swift BOJ

목록 보기
2/15
post-thumbnail

import Foundation

struct stack<T>{
  var elements:[T] = []

  var isEmpty : Bool {
    return elements.isEmpty
  }

  var count: Int {
   return elements.count
  }
  
  func top() -> T?{
    return elements.last
  }
  
  mutating func push(_ element:T){
    elements.append(element)
  }
  
  mutating func pop() -> T? {
    return elements.popLast()
  }
}

Swift에서는 struct에서도 func를 사용할 수 있기 때문에 Class와 차이점이 잘 보이지 않지만 사실 많다.

Class (클래스)

  • 참조 타입이다.
  • ARC로 메모리를 관리한다.
  • 같은 클래스 인스턴스를 여러 개의 변수에 할당한 뒤 값을 변경시키면 할당한 모든 변수에 영향을 준다. (참조 타입의 특성)
  • 상속이 가능하다.
  • 타입 캐스팅을 통해 런타임에서 클래스 인스턴스의 타입을 확인할 수 있다.

Struct (구조체)

  • 값 타입이다.
  • 구조체 변수를 새로운 변수에 할당할 때마다 새로운 구조체가 할당된다.(값 타입의 특성)
  • 값 타입인 구조체에서는 인스턴스 메소드 내에서 프로퍼티들을 수정할 수 없게 되어 있다.(mutating을 사용하여 해결 가능)

ARC란?

ARC(Automatic Reference Counting)은 이러한 메모리 관리 기법 중의 하나로 할당된 메모리를 참조할 때 마다 참조 횟수를 카운팅하고, 이 카운터가 0이 될 때 자동으로 메모리를 반환하게 만드는 방법이다.

Swift는 ARC를 통해 자동으로 메모리를 관리해주므로 사용자가 신경쓰지 않아도 효율적으로 메모리가 관리된다.

Mutating

Swift는 특별히 요청하지 않는 한 속성을 변경하는 메서드를 허용하지 않는다. 즉, 값 타입의 속성은 기본적으로 인스턴스 메서드 내에서 수정할 수 없다는 뜻이다.

Mutating이란?
특정 메소드 내에서 구조체 또는 열거형의 프로퍼티를 수정해야 하는 경우, 해당 메소드의 동작을 변경하도록 하는 것

Ex) 위의 struct 예제 속 mutating의 사용

mutating func push(_ element:T){
    elements.append(element)
  }
  
  mutating func pop() -> T? {
    return elements.popLast()
  }

BOJ 1874


import Foundation

struct stack<T>{
  var elements:[T] = []

  var isEmpty : Bool {
    return elements.isEmpty
  }

  var count: Int {
   return elements.count
  }
  
  func top() -> T?{
    return elements.last
  }
  
  mutating func push(_ element:T){
    elements.append(element)
  }
  
  mutating func pop() -> T? {
    return elements.popLast()
  }
}

var n = Int(readLine()!)!
var result_nums:[Int] = []
var plus_minus:[String] = []

for i in 0..<n {
  result_nums.append(Int(readLine()!)!)
}
if(sequence_Maker(n,result_nums)==true) {
    for i in plus_minus{
      print(i)
    }
}
else {
  print("NO")
}




func sequence_Maker(_ size:Int ,_ nums:[Int]) -> Bool {
  var count = 1
  var target_index = 0
  var mystack = stack<Int>()
  while(true) {
  
   if(nums[target_index]==mystack.top()){
     target_index += 1
     mystack.pop()
     plus_minus.append("-")
     if(target_index==size) {
      return true
    }
     
   }
   else {
      if( count == size+1 ) {
        return false
      }
     mystack.push(count)
     plus_minus.append("+")
     count += 1
    }
  }
    
}


profile
반려묘 하루 velog

0개의 댓글