알고리즘/프로그래머스

[프로그래머스] Lv.2 괄호 회전하기 문제

2024. 4. 13. 19:56

1. 첫 아이디어는 원형 수열 문제처럼 입력 문자열을 두 개 붙이는 것이었다. 오잉 지금 보니 그렇게 풀어도 되는 거였는데 그때 풀이를 잘못했었네..어쨌든! 그렇게 두개를 나란히 붙여서 처음부터 순회하며 길이가 s와 같도록 슬라이스하는 방법이 있고, 이 풀이처럼 removeFirst()를 이용해서 요소를 삭제함과 동시에 리턴된 이 값을 append 하는 방법이 있다. 아래 correct에 해당하는 함수만 잘 작성했다면 뭐든 상관없다.

correct 함수에서, 닫는 괄호가 오는 경우의 분기 처리를 안해줘서 통과가 안됐었다. 예를들어 입력값이 "]]]" 인 경우에 스택이 비어있어서 true를 반환해버린다. 분기처리를 할때는 꼼꼼히 케이스를 따져보아야겠당

func solution(_ s:String) -> Int {
    var rotate = Array(s)
    var count = 0
    
    func correct(_ arr: [Character]) -> Bool {
        var stack = [Character]()
        for i in arr {
            if i == "[" || i == "{" || i == "(" {
                if stack == [] || stack.last == "[" || stack.last == "{" || stack.last == "(" {
                    stack.append(i)
                }
            } else if i == "]" && stack.last == "[" {
                stack.removeLast()
            } else if i == "}" && stack.last == "{" {
                stack.removeLast()
            } else if i == ")" && stack.last == "(" {
                stack.removeLast()
            } else { return false }
        }
        return stack == [] ? true : false
    }
    
    for _ in s {
        rotate.append(rotate.removeFirst())
        if correct(rotate) { count += 1 }
    }
    
    return count
}