문제 설명
다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.
- (), [], {} 는 모두 올바른 괄호 문자열입니다.
- 만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다. 예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다.
- 만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. 예를 들어, {} 와 ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열입니다.
대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.
제한사항
- s의 길이는 1 이상 1,000 이하입니다.
내가 푼 풀이
괄호의 규칙에 따르면
- 괄호가 열리자마자 바로 닫히면 올바른 문자열
- 괄호가 괄호안에 품어있다면 올바른 문자열
- 올바른 괄호 문자열이 연속된다면 합쳐도 올바른 문자열
올바른 문자열이 있다면 올바른 문자열이 존재할때 까지 계속 지워서 문자열의 길이가 0이면 올바른 문자열 이다.
이렇게 짠다면 위 세가지의 규칙에 맞기도하고, Swift로 문자열을 다루기엔 머리가 아팠다. 단순하게 생각했다.
하지만 조건이 떠오르지 않아서, 문자열을 순회하면서 스택에 넣어서 첫번째 규칙에 해당되면 바로 지우는 방식으로 풀었다.
이 문제와 같이 조건에 해당하면, 소거해나가는 형식은 앞으로 stack을 이용해야겠다.
더 단순하게 올바른 문자열이 존재하지 않을때까지 지우는 방법은
문자열s를 s.contains("()") || s.contains("[]") || s.contains("{}") 조건문에 통과하게 만들고
s.replacingOccurrences()로 세가지 괄호를 다 지우는 것이다
s 문자열이 남아있다면 올바르지 않은 문자열, 남아있지 않다면 올바른 문자열
import Foundation
func solution(_ s:String) -> Int {
var result = 0
var check = ["()", "[]", "{}"]
var string = s
for i in 0..<string.count {
var stack = [String]()
var arr = string.map{String($0)}
for j in 0..<arr.count {
stack.append(arr[j])
if stack.count < 2 {
continue
}
while stack.count > 1 {
var str = "\(stack[stack.endIndex-2])" + "\(stack[stack.endIndex-1])"
if check.contains(str) {
stack.popLast()
stack.popLast()
} else {
break
}
}
}
if stack.count < 1 {
result += 1
}
var first = string.removeFirst()
string = "\(string)" + "\(first)"
}
return result
}
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
튜플 Swift (0) | 2023.04.12 |
---|---|
[1차] 캐시 Swift (0) | 2023.04.12 |
귤 고르기 Swift (0) | 2023.04.12 |
멀리 뛰기 Swift (0) | 2023.04.11 |
예상 대진표 Swift (0) | 2023.04.11 |