본문 바로가기

백준 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에 추가해줬습니다.

 

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

728x90