본문 바로가기
Problem Solving

[Swift] 프로그래머스 괄호 회전하기(lv. 2)

by DuncanKim 2023. 3. 20.
728x90

[Swift] 프로그래머스 괄호 회전하기(lv. 2)

 

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/76502

 

프로그래머스

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

programmers.co.kr

 

2. 접근

괄호가 소, 중, 대괄호 모두 등장하는 괄호문제이다.

올바른 괄호인지를 물어보는 것이 아니라, 문자열을 회전시키면서 그것이 올바른 괄호인지를 판별하고, 그 개수를 리턴해야 하는 문제이다.

 

문자열의 길이만큼 반복문을 필수적으로 돌아야 하고, 한 번의 반복마다 그 괄호가 올바른지 판별해야 하므로 이중 반복문을 사용해야 할 것 같았다. 그래서 아래 코드에 보면 회전을 시키는 조건문을 먼저 두었다.

 

stack에는 괄호를 하나씩 넣고, leftBracket과 rightBracket 배열을 활용하여 서로 인덱스가 같은 괄호이면 remove, 아니면 append를 하는 방식으로 올바른 괄호인지를 판별하게 하는 로직을 구현했다.

 

최종적으로 answer에는 올바른 괄호 문자열의 개수가 들어 있을 것이고, 그것을 리턴하면 정답을 얻을 수 있다.

 

 

3. 코드

import Foundation

func solution(_ s:String) -> Int {
    let leftBracket: [Character] = ["[", "(", "{"]
    let rightBracket: [Character] = ["]", ")", "}"]
    var answer = 0
    
    var innerS = Array(s)
    for i in 0 ... s.count - 1{
        // 왼쪽으로 1회전.
        if i != 0 {
            let temp = innerS.first!
            innerS.removeFirst()
            innerS.append(temp)
        }
        var stack = [Character]()
        for (index, j) in innerS.enumerated() {
            if stack.count >= 1 && leftBracket.contains(stack.last!) && rightBracket.contains(j) {
                if leftBracket.firstIndex(of: stack.last!) == rightBracket.firstIndex(of: j) {
                    stack.removeLast()
                } else {
                    stack.append(j)
                }
            } else {
                stack.append(j)
            }
            if index == innerS.count - 1 && stack.count == 0 {
                answer += 1
            }
        }
    }
    return answer
}
728x90

댓글