본문 바로가기

백준 PS일지/Stack

[백준/Swift] 12605: 단어순서 뒤집기 | PS일지

 

문제

 

12605번: 단어순서 뒤집기

스페이스로 띄어쓰기 된 단어들의 리스트가 주어질때, 단어들을 반대 순서로 뒤집어라. 각 라인은 w개의 영단어로 이루어져 있으며, 총 L개의 알파벳을 가진다. 각 행은 알파벳과 스페이스로만

www.acmicpc.net

간단한 문제 요약

Case별로 한 문장에서 space로 띄어쓰기 된 단어를 반대로 뒤집어라!

 

문제 풀이

LIFO(Last In First Out)의 특징을 지닌 stack으로 풀 수 있습니다. stack의 특성상 pop을 해야할 때 가장 최근에 stack의 list에 삽입된 top에 있는 원소가 pop됩니다.

 

Swift 고차함수, reversed()를 통해서 아주 간단히 풀 수 있습니다.

(1...Int(readLine()!)!).map{ print("Case #\($0): \(readLine()!.split{$0==" "}.reversed().joined(separator: " "))") }

 

 

근데 stack을 구현해보고 싶어서 구현해봤습니다.

struct Stack<T> {
    typealias Element = T
    private var lists: [Element]
    init(lists: [Element] = [Element](), type: Element.Type) {
        self.lists = lists
    }
}
extension Stack {
    mutating func push(_ element: Element) {
        lists.append(element)
    }
    mutating func pop() -> Element?{
        guard count != 0 else { return nil }
        return lists.removeLast()
    }
    var count: Int {
        return lists.count
    }
    var top: Element {
        return lists[count-1]
    }
}

 

 

기본적인 push, pop, top원소, stack에서 보유중인 Element를 출력하는 count!

 

_=(1...Int(readLine()!)!).map{ caseIndex in
    var stack = Stack(type: String.self)
    var reversedText = ""
    for text in readLine()!.split{$0==" "} {
        stack.push(String(text))
    }
    while let text = stack.pop() {
        reversedText += "\(text) "
    }
    print("Case #\(caseIndex): \(reversedText)")
}

그리고 stack에 원소를 추가한 후에 while구문으로 더 이상 pop을 하지 않을 때까지 pop된 Element를 reversedText에 추가해줬습니다.

 

확실히 라이브러리를 사용하는게 간편하네요,,