728x90
https://www.acmicpc.net/problem/9012
스택 구현 관련 문제로 단골 출시되고 있는 괄호 문제다.
먼저 swift는 딱히 스택을 구현하지 않아도 되는데 그 이유는 popLast, appned 메서드가 이미 구현되어 있기 때문에
그냥 배열을 스택처럼 사용하면 된다.
[1, 2, 3, 4, 5] 이런 배열이 있다고 쳐보면 이것을 세로로 세우게 되면 그게 바로 스택이다.
위에 메서드 popLast의 이름을 보고 유추할 수 있듯이 그냥 어렵게 구현하지 말고 이거 써라 라고 하는 것 같다.
위 문제 설명을 하자면 먼저 괄호는 무조건 () 이렇게 한쌍으로 이루어져야 한다. 이것을 VPS 형태라 명한다. 문제는 어떻게 필수적으로 한쌍을 인식하게 만들 수 있을까에서 막혀버렸다.
그래서 별 생각을 다 해보다 스택이 중점이라는 것을 눈치 채곤 다시 생각해봤다. 먼저 VPS형태에 해당하는 괄호 한쌍을 만들기 위해선 "("가 무조건 먼저 나와야한다. 그 다음엔 ")"가 나온다. 이를 이용해서.
(가 나오면 1을 추가하고 )이 나오면 -1을 해서 서로 합한 것이 0이 나왔을때 한쌍으로 인식하게 만들었다.
즉 다시 말하면 스택상에 VPS형태의 괄호 쌍을 모두 입력했을때 총 합이 0이 나와야 한다는 것이다.
총 합이 음수가 나오거나 0보다 크게 나온다면 그것은 VPS형태가 아닐 것이다.
import Foundation
var test = Int(readLine()!)!
var answer: String = ""
var stack: [String] = []
var isVPS: Bool
for _ in 0..<test {
isVPS = true // 이건 왜하지? 참으로 초기화 해놓고 나중에 안되면 거짓으로 변경.
stack.removeAll() // 사용한 후 항상 초기화 해야함.
let input: String = readLine()!
for i in input {
if i == "(" {
stack.append("(")
}else if stack.isEmpty{
isVPS = false
break
}else {
stack.removeLast()
}
}
if !stack.isEmpty {
answer += "NO\n" // 스택이 비어있지 않다면 (서로 짝지어 있지 않는경우를 말함)
} else if isVPS == true{
answer += "YES\n"
} else {
answer += "NO\n"
}
}
print(answer)
728x90
'PS' 카테고리의 다른 글
11050번 이항계수 1 / swift (0) | 2022.10.03 |
---|---|
10828번 스택 / swift (0) | 2022.10.03 |
2609 최대공약수와 최소공배수 / swift (0) | 2022.10.02 |
2164번: 카드 2 / swift (0) | 2022.10.02 |
1920번 수 찾기 - swift (0) | 2022.09.30 |