👨🏻‍💻iOS 공부/Swift_알고리즘 풀이

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

728x90
반응형

https://programmers.co.kr/learn/courses/30/lessons/76502?language=swift# 

 

코딩테스트 연습 - 괄호 회전하기

 

programmers.co.kr

그냥 쌩 구현 문제! 

 

그냥 모든 값들을 if-else로 해주는 방법이 아니라 다른 방법으로 풀고 싶었는데 그런 문제가 아닌 것 같다... 

그러다 보니 조금 번잡스럽게 풀이한 것 같다. 오히려 contains나 index를 활용하면 더 간단하게 풀 수 있을 것 같다. 

그럼에도 우선 올바른 배열이 되기 위한 조건들을 충족시켜줘야 한다. 

 

조건보다도 예외케이스를 생각하면서 풀이하면 좋을 듯 하다. 

 

1. ( [ ) ]

2. [ { ) ]

3. { { { }

4. } { ( )

 

이 정도 케이스만 고려해도 풀 수 있을 것이다!

 

import Foundation

func solution(_ s:String) -> Int {
    // 1개면 0 리턴
    if s.count == 1 { return 0 }    
    var str = s.map {String($0)}
    var res = 0
    
    for _ in 0..<str.count {
        // 처음 원소를 끝으로 이동
        str.append(str.removeFirst())
        // 올바른 배열인지 확인
        if isCorrect(str) {
            res += 1
        }
    }
    return res
}

// 올바른 배열인지 확인 
func isCorrect(_ str: [String]) -> Bool {
    // 첫 원소 저장
    var stack = [change(str[0])]

    // 다음에 올 값
    var next = 0
    // index 1부터 시작
    for s in str[1...] {        
        next = change(s)
        if let last = stack.last {
            // last가 } ) ] 인 경우
            if last < 0 {
                return false
            }
            
            // next가 ) } ] 일 경우 
            if next < 0 {
                // 더해서 무조건 한 쌍이 사라져야한다.
                // 아닐 경우 [(]) 와 같은 혼종이 탄생한다.
                if next + last == 0 {
                    // last가 stack에서 빠지고, next는 들어오지 않게 된다.
                    stack.removeLast()
                } else {
                    // 위 예외 케이스가 나오면 바로 false
                    return false
                }
            // ( { [ 인 경우는 우선 추가
            } else {
                stack.append(next)
            }
        // stack이 비었을 때
        } else {
            // 다음 값이 ) } ] 인 경우
            if next < 0 {
                return false
            // ( { [ 인 경우는 우선 추가
            } else {
                stack.append(next)
            }
        }
    }
    
    // stack이 비어있어야 올바른 배열
    return stack == [] ? true : false
}

// 특수문자를 정수로 변환
func change(_ s: String) -> Int {
    var next = 0
    if s == "[" || s == "]" {
        next = s == "[" ? 1 : -1
    } else if s == "{" || s == "}" {
        next = s == "{" ? 2 : -2
    } else if s == "(" || s == ")" {
        next = s == "(" ? 3 : -3
    }
    return next
}

 

너무 복잡스럽게 푼 것 같다... 

그래도 효율이나 정확성에서는 문제에서 요구하는 바에 충족되기에 우선은 제출하였다. 

contains와 indexing을 활용해서 조금 더 줄여볼 필요가 있을 것 같다...! 

728x90
반응형