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와 차이점이 잘 보이지 않지만 사실 많다.
ARC(Automatic Reference Counting)은 이러한 메모리 관리 기법 중의 하나로 할당된 메모리를 참조할 때 마다 참조 횟수를 카운팅하고, 이 카운터가 0이 될 때 자동으로 메모리를 반환하게 만드는 방법이다.
Swift는 ARC를 통해 자동으로 메모리를 관리해주므로 사용자가 신경쓰지 않아도 효율적으로 메모리가 관리된다.
Swift는 특별히 요청하지 않는 한 속성을 변경하는 메서드를 허용하지 않는다. 즉, 값 타입의 속성은 기본적으로 인스턴스 메서드 내에서 수정할 수 없다는 뜻이다.
Mutating이란?
특정 메소드 내에서 구조체 또는 열거형의 프로퍼티를 수정해야 하는 경우, 해당 메소드의 동작을 변경하도록 하는 것
Ex) 위의 struct 예제 속 mutating의 사용
mutating func push(_ element:T){
elements.append(element)
}
mutating func pop() -> T? {
return elements.popLast()
}
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
}
}
}