문제 설명
괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어
"()()" 또는 "(())()" 는 올바른 괄호입니다.
")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.
'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.
제한사항
문자열 s의 길이 : 100,000 이하의 자연수
문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.
1차 고민
누가 봐도 스택을 활용한 문제인거같긴하다. 그런데 올바른지만 판단하는 과정에서 꼭 스택을 사용해야하는건 아니니까 이름만 스택으로 하고 필요한 것만 가져다 쓰는 느낌으로 할 것 같다.
1차 코드
import Foundation
func solution(_ s:String) -> Bool
{
var ans:Bool = false
var stack = 0
for i in s {
if stack == 0 && i == ")" {
return ans
}
if i == "(" {
stack += 1
} else {
stack -= 1
}
}
if stack == 0 {
ans = true
}
return ans
}
1차 결과
2차 고민
답은 맞는데 효율성이 없다고 나온다. 도대체 효율적으로 나오기 위해서 조건을 짧게 하거나 불필요하게 for문이 돈다거나 하는 부분을 짚어보기로 했다.
첫 if문에서 &&으로 조건을 달지 말고 그냥 stack이 0 미만이 되면 바로 return false를 하는 것이 좋을 것 같다는 생각을 했다.
2차 코드
import Foundation
func solution(_ s:String) -> Bool
{
var ans:Bool = false
var stack = 0
for i in s {
if stack < 0 {
return ans
}
if i == "(" {
stack += 1
} else {
stack -= 1
}
}
if stack == 0 {
ans = true
}
return ans
}
2차 결과
보완점
이게 효율성이구나 싶은 문제였다.
굳이 조건적으로 복잡하게 매 번 for문을 돌면서 버벅거리는 문제가 좀 줄어든건가싶다.
앞으로는 저런 흐름이 바로 머릿속에 들어왔으면 좋겠다.
'iOS > Programmers' 카테고리의 다른 글
[Swift] lv.2 이진 변환 반복하기 | Programmers (0) | 2024.03.27 |
---|---|
[Swift] lv.1 최대공약수와 최소공배수 | Programmers (0) | 2024.03.26 |
[Swift] lv.2 최솟값 만들기 | Programmers (1) | 2024.03.22 |
[Swift] lv.2 JadenCase 문자열 만들기 | Programmers (0) | 2024.03.21 |
[Swift] lv.1 직사각형 별찍기 | Programmers (0) | 2024.03.20 |