코딩테스트

[프로그래머스] 괄호 회전하기

raccoon97 2023. 3. 7. 23:27

난이도 : Lv 2

분류 : 스택

 

문제

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

코드

 
import Foundation

func solution(_ s:String) -> Int {
    let n = s.count
    let s = Array(s)
    var answer = 0
    
    for i in 0..<n { // 문자열을 회전시키는 모든 경우만큼 반복
        var stack = [Character]()
        
        var is_valid = true // 괄호 문자열이 올바른지 확인할 변수
        
        for j in 0..<n { // 회전한 문자열 순회, 문자열 검사
        
            let c = s[(i+j)%n] // 회전한 문자열 인덱스 계산
            
            if c == "(" || c == "[" || c == "{" { // 여는 괄호일 경우
                stack.append(c) // 스택에 추가
                
            } else { // 닫는 괄호일 경우
                if stack.isEmpty { // 스택이 비어 있을 경우 괄호가 올바르지 않음
                    is_valid = false
                    break
                }
                let top = stack.last! // 스택의 top을 가져옵니다.
                
                if (c == ")" && top == "(") || (c == "]" && top == "[") || (c == "}" && top == "{") { // 매치되는 경우 스택에서 top을 제거합니다.
                    stack.removeLast()
                    
                } else { // 매치되지 않는 경우 괄호가 올바르지 않음
                    is_valid = false
                    break
                }
            }
        }
        if stack.isEmpty && is_valid { // 스택이 비어 있고, 괄호가 올바를 경우 1 추가
            answer += 1
        }
    }
    
    return answer
}

 

풀이

1. 문자열을 배열로 만들어서 인덱스로만 회전을 가한다.

2. 인덱스로 회전시킨 문자열의 0번째 글자부터 괄호를 확인한다. 이 때, 스택이 비어있는데 괄호가 닫힌다면 빠져나온다.

3. 열려있는 괄호를 스택에 쌓았다면 나머지 글자를 확인해서 스택의 Top 부분과 매칭시킨다.

4. 스택이 비어있고 is_valid 가 true 라면 올바른 문자열 개수를 늘린다.

 

P.S

인덱스로 회전을 시키는 방법이 참 좋은 것 같습니다.

기존의 코드는 removeLast, insert 를 사용해서 오버헤드가 발생했는데,

인덱스를 사용하니 오버헤드 없이 깔끔하고 빠르게 풀이가 가능합니다.