[Swift]BOJ-10828

BOJ-10828, 스택

문제 📑

https://www.acmicpc.net/problem/10828

 

10828번: 스택

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net

문제 정리 ▾

BOJ-10828

  • 처음 명령어의 개수가 입력되고, 각각의 명령어가 입력이 되었을 때 명령어에 맞는 결과를 출력하면 된다.
    • push: 스택에 값을 넣는 명령어
    • pop: 스택 가장 위에 있는 정수 출력 및 제거, 비어있을 경우 -1 출력
    • size: 스택의 사이즈 출력
    • empty: 스택이 비어있으면 1, 아니면 0 출력
    • top: 스택 가장 위에 값 출력, 비어있을 경우 -1 출력

 

접근 🚶🏻

나의 생각 ▾

  • 스택은 학교에서도 많이 다뤘던 부분이라 주어진 조건에 맞춰 함수로 구현하면 된다고 생각했다.

나의 해결 ▾

import Foundation

var stack = [Int]()
func solution() {
    let cnt = Int(readLine()!)!
    
    for _ in 1...cnt {
        let value = readLine()!.split(separator: " ").map{ String($0) }
        switch value[0] {
        case "push":
            push(Int(value[1])!)
            break
        case "pop":
            print(pop())
            break
        case "size":
            print(size())
            break
        case "empty":
            print(empty())
            break
        case "top":
            print(top())
            break
        default:
            break
        }
    }
}

func push(_ value: Int) {
    stack.append(value)
}

func pop() -> Int {
    if let pop = stack.popLast() {
        return pop
    } else {
        return -1
    }
}

func top() -> Int{
    if let topValue = stack.last {
        return topValue
    } else {
        return -1
    }
}

func size() -> Int{
    let size = stack.count
    return size
}

func empty() -> Int{
    if stack.isEmpty {
        return 1
    } else {
        return 0
    }
}

solution()
  • 코드에 관한 내용은 밑에서 살펴보자

 

코드 리뷰 ▾

var stack = [Int]()

func solution() {
    let cnt = Int(readLine()!)!
    
    for _ in 1...cnt {
        let value = readLine()!.split(separator: " ").map{ String($0) }
        switch value[0] {
        case "push":
            push(Int(value[1])!)
            break
        case "pop":
            print(pop())
            break
        case "size":
            print(size())
            break
        case "empty":
            print(empty())
            break
        case "top":
            print(top())
            break
        default:
            break
        }
    }
}
  • stack이라는 Int형 배열 전역 변수로 선언하여 다른 함수에서도 접근할 수 있게 하였다.
  • cnt라는 변수에 명령어의 개수를 넣어주었다.
  • 그 후 cnt 횟수만큼 for문을 돌려 입력을 받게 하며, push 1처럼 명령어를 받을 경우가 있어 value로 배열로 값을 넣을 수 있게 구현하였다.
  • value[0]의 값을 통해 switch문으로 각각의 경우를 나눠 함수들을 호출시켰다.

func push(_ value: Int) {
    stack.append(value)
}
  • push는 들어오는 값을 stack이라는 배열에 넣어주었다.

func pop() -> Int {
    if let pop = stack.popLast() {
        return pop
    } else {
        return -1
    }
}
  • if let 문을 사용해 stack.last가 있을 경우 popLast()로 마지막 값을 제거해주며, pop값을 반환해준다.
  • 비어있을 경우는 -1을 출력해주었다.

func top() -> Int{
    if let topValue = stack.last {
        return topValue
    } else {
        return -1
    }
}
  • top은 pop과 비슷한 결로 if let을 통해 비어있는지 체크를 하여 각각의 값을 반환해주었다.

func size() -> Int{
    let size = stack.count
    return size
}
  • size는 말 그대로 stack 배열의 사이즈를 반환해주면 끝!

func empty() -> Int{
    if stack.isEmpty {
        return 1
    } else {
        return 0
    }
}
  • empty는 stack 배열이 비어있는지 체크하여 각각의 케이스에 맞는 값을 반환해주었다.

 

Additional 📂

  • 이번 10828번 문제를 통해 stack을 더 견고히 다지는 계기가 되었다.
  • 알고리즘 기초부터 풀어보고 있는데 아직까진 어렵지 않다.
  • 앞으로도 평화롭게 알고리즘을 풀어갔으면 좋겠다...🥲

'Algorithm.zip' 카테고리의 다른 글

[Swift]BOJ-9012  (0) 2022.01.31
[Swift]BOJ-9093  (0) 2022.01.31
[Swift]BOJ-10815  (0) 2022.01.29
[Swift]BOJ-1158  (0) 2022.01.27
[Swift]BOJ-1920  (0) 2022.01.26