문제 설명

다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.

  • (), [], {} 는 모두 올바른 괄호 문자열입니다.
  • 만약 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

+ Recent posts