Algorithm Problem Solving/Programmers

[프로그래머스] 월간 코드 챌린지 시즌2 괄호 회전하기 with Swift

코코자장자장 2022. 1. 20. 17:12

안녕하세요. 오늘은 프로그래머스 괄호 회전하기 문제를 풀어보겠습니다.

괄호와 관련된 문제는 대부분 Stack 자료구조를 이용하면 문제를 해결하실수 있습니다.

Stack은 Swift의 배열을 이용해서 append()와 removeLast()만 이용해서 사용하시면 됩니다!

 

이 문제도 마찬가지로 Stack 자료구조를 이용해서 문제를 풀어보겠습니다!

 

1. 문자열을 회전시킨다.

var s1 = s[s.index(s.startIndex, offsetBy: i)...s.index(s.endIndex, offsetBy: -1)]
if i != 0 {
    s1 += s[s.startIndex...s.index(s.startIndex, offsetBy: i-1)]
}

 

2. push or pop 결정한다.

var isPop = false
for k in 0..<3 {
    if j == popCharacter[k] {
        isPop = true
        break
    }
}

 

3. push or pop을 한다.

if isPop == true {
    if stack.isEmpty == true {
        continue rotateLoop
    }
    if j == "]" {
        if stack.last != "[" {
            continue rotateLoop
        }
    }
    else if j == ")" {
    	if stack.last != "(" {
    		continue rotateLoop
    	}
    }
    else if j == "}" {
    	if stack.last != "{" {
        	continue rotateLoop
        }
    }
    stack.removeLast()
}
else if isPop == false {
	stack.append(j)
}

 

4. 마지막으로 문자열이 비어서 모든 괄호가 정상적이라면 answer에 1을 더하면 됩니다.

if stack.isEmpty == true {
    answer += 1
}

 

 

 

import Foundation

let popCharacter:[Character] = ["}", "]", ")"]

func solution(_ s:String) -> Int {
    var answer = 0
    var s = s
    
    rotateLoop : for i in 0..<s.count {
        var stack:[Character] = [Character]()
        
        var s1 = s[s.index(s.startIndex, offsetBy: i)...s.index(s.endIndex, offsetBy: -1)]
        if i != 0 {
            s1 += s[s.startIndex...s.index(s.startIndex, offsetBy: i-1)]
        }
        
        for j in s1 {
            var isPop = false
            for k in 0..<3 {
                if j == popCharacter[k] {
                    isPop = true
                    break
                }
            }
            
            if isPop == true {
                if stack.isEmpty == true {
                    continue rotateLoop
                }
                if j == "]" {
                    if stack.last != "[" {
                        continue rotateLoop
                    }
                }
                else if j == ")" {
                    if stack.last != "(" {
                        continue rotateLoop
                    }
                }
                else if j == "}" {
                    if stack.last != "{" {
                        continue rotateLoop
                    }
                }
                stack.removeLast()
            }
            else if isPop == false {
                stack.append(j)
            }
        }
        if stack.isEmpty == true {
            answer += 1
        }
    }
    
    return answer
}

 

오늘은 여기까지입니다.

궁금하신 점이나 질문이 있으시면 댓글로 남겨주세요~