문제

 

풀이코드

// [BOJ] 10828 - 스택

public struct Stack<T> {
    private var elements = [T]()
    public init() {}
    
    public mutating func pop() -> T? {
        return self.elements.popLast()
    }
    
    public mutating func push(_ element: T) {
        self.elements.append(element)
    }
    
    public func top() -> T? {
        return self.elements.last
    }
    
    public var empty: Int {
        return self.elements.isEmpty ? 1 : 0
    }
    
    public var size: Int {
        return self.elements.count
    }
}

let N = Int(readLine()!)!
var intStack = Stack<Int>()
var lastElement : Int?
for _ in 0..<N {
    let command = readLine()!.split(separator: " ")
    switch command[0] {
    case "push":
        intStack.push(Int(command[1])!)
    case "pop":
        lastElement = intStack.pop()
        print(lastElement == nil ? -1 : lastElement!)
    case "size":
        print(intStack.size)
    case "empty":
        print(intStack.empty)
    default:
        lastElement = intStack.top()
        print(lastElement == nil ? -1 : lastElement!)
    }
}

 

풀이과정

https://ai-hong.tistory.com/198?category=1001478 

 

에서 설명한 것과 같이 오늘은 스택을 이용한 문제를 풀었다.

개념을 공부하고 문제를 보니 큰 어려움은 없었다.

 

구조체로 스택을 선언하고, 다만 문제에 나와있는대로 그 내용을 조금 변경했다.

 

문제에

  • push X: 정수 X를 스택에 넣는 연산이다.
  • pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • size: 스택에 들어있는 정수의 개수를 출력한다.
  • empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
  • top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.

가 나와 있기 때문에 이를 따라 구조체를 선언해 주었고,

Switch - case 구문을 통하여 각각의 상황에 맞는 함수 혹은 파라미터를 호출해 주었다 :)

 

문제에서 지정된 명령어 이외의 명령은 없다고 나와있기에

"top"같은 경우, default 에 기능을 넣어 주었다

깔끔히 통과!

Stack의 개념

나중에 입력된 것이 먼저 출력되는 데이터 구조 -> LIFO(Last In First Out)

 

Swift에서의 Stack 관련 메소드 & 프로퍼티

 - push() : stack에 데이터 삽입

 - pop() : 가장 마지막 데이터 삭제 및 반환

 - peek() : 가장 마지막 요소 반환

 - count  : 스택의 크기 ( 저장된 데이터의 갯수 )

 - isEmpty() : 스택이 비어있는 지 확인

 - isFull() : 스택이 꽉 차 있는 지 확인

 

구조체로 Stack 구현

public struct Stack<T> {
    private var elements = Array<T>()
    public init() {}
    
    // 스택의 마지막 데이터 삭제후 반환
    public mutating func pop() -> T? {
        return self.elements.popLast()
    }
    
    // 스택에 데이터 삽입
    public mutating func push(element: T) {
        self.elements.append(element)
    }
    
    // 스택의 마지막 데이터 반환 ( 삭제 X )
    public func peek() -> T? {
        return self.elements.last
    }
    
    // 스택이 비어있다면 true 반환
    public var isEmpty: Bool {
        return self.elements.isEmpty
    }
    
    // 스택에 저장된 데이터 갯수 반환
    public var count: Int {
        return self.elements.count
    }
}

* 제네릭

- <T> 를 사용함으로써, 타입을 지정하지 않고 호출되는 순간의 타입을 사용하도록 한다!

 

스택 사용

public struct Stack<T> {
    private var elements = [T]()
    public init() {}
    
    public mutating func pop() -> T? {
        return self.elements.popLast()
    }
    
    public mutating func push(_ element: T) {
        self.elements.append(element)
    }
    
    public func peak() -> T? {
        return self.elements.last
    }
    
    public var isEmpty: Bool {
        return self.elements.isEmpty
    }
    
    public var count: Int {
        return self.elements.count
    }
}

var stackEx = Stack<Int>()
stackEx.push(1) // [1]
stackEx.push(2) // [1, 2]
stackEx.push(3) // [1, 2, 3]

var x = stackEx.pop() // x = 3
x = stackEx.pop() // x = 2
x = stackEx.pop() // x = 1
x = stackEx.pop() // nil

stackEx.isEmpty // true

 

출처

https://0ofkim.tistory.com/49

https://gimjinging.tistory.com/83

https://babbab2.tistory.com/85

https://the-brain-of-sic2.tistory.com/38

 

SwiftUI에서 어떠한 view는 View 프로토콜을 준수해야 한다

protocol View {
	associatedtype Body: View
    	var body: Self.Body { get }
}

 

=> 프로토콜을 보면 알 수 있듯, 필수로 구현해 줘야 하는것은 연산프로퍼티인 읽기 전용 body 임을 알 수 있음

 

Text, Image, Color, Stack, Group, GeometryReader 등의 컨텐츠나 컨테이너 뷰에는 더이상 Body를 호출하지 않게 Never 타입을 사용

typealias Body = Never

 

1. 선언형

명령형 vs 선언형

명령형

UIKit 의 경우 명령형 선언으로써, 방법(How)에 초점을 두어 코드를 서술한다.

1) 버튼을 생성

2) 버튼의 제목 설정

3) 버튼 제목의 색상 설정

4) 폰트 지정

5) 버튼 클릭시 호출할 메서드 지정

6) 루트 뷰에 자식 뷰를 추가

7) 버튼을 화면 가운데로 배치

 

선언형

SwiftUI의 경우 선언형 선언으로써, 무엇(What)에 초첨을 두어 코드를 서술

Button(action: {
	print("Hello, SwiftUI")
}) {
	Text("SwiftUI")
    	.font(.title)
        .foregroundColor(.black)
}

=> 버튼을 생성하는데 버튼의 글자는 "SwiftUI" 이고, 폰트는 title, 색상은 검정색, 클릭했을때는 "Hello, SwiftUI"를 출력해줘

 

2. 자동화

=> 가능한 많은 기능이 자동으로 수행될 수 있게 제공하는것

자동화를 통하여 화면에 뷰를 배치할 오토 레이아웃 코드를 제거하고 최소한의 설명으로 적용할 수 있게 되었음

3.  조합

=> 큰 뷰를 하나의 기능을 가진 작은 뷰들로 잘게 나누거나 각각의 뷰를 조합해 원하는 뷰를 쉽게 만들어 낼수 있게 지원

4. 일관성

=> 데이터와 동기화되어 일관성 있게 보여줘야함

1) 데이터가 변경되면 그에 맞게 UI도 변경되어야함

2) 데이터가 변경되는 즉시 UI도 자동 갱신

3) 뷰의 특정 상태를 저장할 State / 모델 객첼의 변화를 관찰할 ObservableObject 로 인하여 데이터의 변화를 감지, UI 갱신

 

문제

 

풀이 코드

func solution(_ x:Int, _ n:Int) -> [Int] {
    var listArray: [Int] = [x];
    for _ in 0..<n-1 {
        listArray.append(listArray.last! + x)
    }
    return listArray
}

 

풀이 과정

for 반복문을 이용하여 x 만큼 계속 더해주었고,

Array.last 를 이용하여 마지막 값에 누적 합산 해 주었다!

 

다른사람의 풀이

func solution(_ x:Int, _ n:Int) -> [Int64] {
    return Array(1...n).map { Int64($0 * x) }
}

고차함수를 생각하자!!

map 이라는 메서드가 있다!

swift는 이제 막 공부를 다시 시작한거라 문법을 좀 익힐 필요가 있을 것 같다

+ Recent posts