문제

 

풀이코드

// [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

 

문제

 

풀이 코드

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는 이제 막 공부를 다시 시작한거라 문법을 좀 익힐 필요가 있을 것 같다

문제

 

풀이 코드

import Foundation

let n = readLine()!.components(separatedBy: [" "]).map { Int($0)! }
let (a, b) = (n[0], n[1])

for _ in 0..<b {
    for _ in 0..<a{
        print("*",terminator: "")
    }
    print()
}

문제

 

풀이 코드

const calcuGCD = (n, m) => {
  return n % m == 0 ? m : calcuGCD(m, n % m);
};

function solution(arr) {
  let gcd = calcuGCD(arr[0], arr[1]);
  let lcm = (arr[0] * arr[1]) / gcd;

  for (let i = 2; i < arr.length; i++) {
    gcd = calcuGCD(lcm, arr[i]);
    lcm = (lcm * arr[i]) / gcd;
  }
  return lcm;
}

 

풀이 과정

여러 수의 최소공배수를 구하는 방법은 다음과 같다.

 

1. A 와 B 의 최소공배수를 구한다.

2. 1의 최소공배수와 C의 최소공배수를 구한다.

3. 2의 최소공배수와 D의 최소공배수를 구한다.

4 ... 반복한다

 

이렇게 하면 N개 수의 최소공배수를 구할수 있다.

 

최소 공배수를 구하기 위하여 

유클리드 호제법을 이용한 최대 공약수 계산 함수를 생성하고,

 

인덱스 0 과 1 의 최소공배수를 우선 구한후,

다음 인덱스의 수들과 의 최소공배수를 구하도록 하였다.

 

다른사람의 풀이

function nlcm(num) {
 return num.reduce((a,b) => a*b / gcd(a,b))  
}

function gcd(a, b) {
  return a % b ? gcd(b, a%b) : b
}

할말을 잃었다.

풀이가 너무 간단하게 나왔다

+ Recent posts