괄호 문제 답게 스택을 활용하는 것으로 보였다. 이전에 풀어봤던 내용이라 어렵지 않게 제출할 수 있었다.
제출 코드
import Foundation
func solution(_ s: String) -> Bool {
var ans = false
var stack: [Character] = []
for item in s {
if item == "(" {
stack.append(item)
}
else {
if stack.last! == "(" {
stack.popLast()
}
}
}
return stack.isEmpty ? true : false
}
스택 배열을 만들어주고 여는 괄호 (
가 있을 때만 ! 넣어주고 마지막 원소랑 비교하면서 닫히는게 나오면 닫히는걸 넣지말고 마지막 원소를 이제 pop해주는 방식으로헤서 배열안에 원소가 남냐 안남냐로 판단해주면 된다! (일반적인 스택 풀이 방식)
오잉
틀렸네 ?
틀린 예제는")()("
였는데, 자세히 보니 스택자체가 비어있을 때에 )
가 들어오면 비어있는 배열에서 popLast()
를 물으니 이게 펑하고 터져버린 것이었다.
그래서 이를 위해서 조건을 하나 달아주면...!
if stack.isEmpty {return false}
완성코드
import Foundation
func solution(_ s: String) -> Bool {
var ans = false
var stack: [Character] = []
for item in s {
if item == "(" {
stack.append(item)
}
else {
if stack.isEmpty {
return false
}
if stack.last! == "(" {
stack.popLast()
}
}
}
return stack.isEmpty ? true : false
}
타인의 코드
import Foundation
func solution(_ s:String) -> Bool
{
var ans:Bool = false
var openCnt: Int = 0, closeCnt: Int = 0
for ch in s {
switch ch {
case "(":
openCnt += 1
case ")":
closeCnt += 1
default:
break
}
guard openCnt >= closeCnt else {
break
}
}
ans = openCnt == closeCnt
return ans
}
다음과 같이 나와 있었는데 switch
활용해서 가독성이 높게 느껴졌고, 나중에 여러가지 괄호가 있을 때 더 유용한 코드같아 보였다.
guard
자체가 너무 생소해서 볼 때마다 새로운데, 여기서는 closeCnt
가 더 커져버린 순간 터져버리도록 유도해서 에러를 방지한 것으로 보였다.
또 사소하게 얻어간 내용은
var openCnt: Int = 0, closeCnt: Int = 0
이렇게 한줄로 쉼표 활용해서 선언 여러개 해줄 수 있구나 하는정도 가져갈 수 있었다