코딩테스트

[Swift 알고리즘] 프로그래머스(Lv.2) - 괄호 회전하기

유정주 2022. 5. 3. 09:55
반응형

안녕하세요. 개발 중인 정주입니다.

 

오늘은 "프로그래머스(Lv.2) - 괄호 회전하기" 문제를 풀었습니다.

 


Github

 

GitHub - jeongju9216/SwiftAlgorithm: 스위프트 알고리즘

스위프트 알고리즘. Contribute to jeongju9216/SwiftAlgorithm development by creating an account on GitHub.

github.com

 

문제 링크

 

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

 

programmers.co.kr

 


풀이

0. 문제 이해하기

왼쪽으로 이동한다는 의미를 잘 이해해야 합니다.

단순히 왼쪽으로 한 칸씩 이동하는 것이 아니라, 

가장 왼쪽의 괄호를 오른쪽에 붙이는 형식으로 회전 시키는 것입니다.

 

전 이것을 착각해서 꽤나 헤맸네요 ㅠㅠ

 

1. 올바른 괄호인지 확인하기

올바른 괄호는 스택을 이용해 확인하면 됩니다.

이번 문제의 괄호는 (), [], {} 로 총 3가지 입니다.

딕셔너리를 이용해 세 가지 괄호를 관리했습니다.

 

입력된 괄호가 여는 괄호라면 스택에 추가합니다.

입력된 괄호가 닫는 괄호이고 짝이 맞는 괄호라면 pop 합니다.

만약 짝이 맞지 않다면 올바른 괄호가 아닙니다.

 

모든 괄호를 살펴보았을 때 스택이 비어있다면 올바른 괄호이고 아니면 올바른 괄호가 아닙니다.

스택이 비어있지 않다는 것은 쌍이 맞지 않는 괄호가 있다는 의미이기 때문입니다.

 

2. 왼쪽으로 회전하기

문자열을 편의를 위해 Character 배열로 변환합니다.

첫 번째 원소를 삭제해서 마지막에 붙여야 합니다.

removeFirst( )가 삭제한 원소를 return 하므로 그대로 append 해주면 됩니다.

 

감사합니다!


전체 코드

import Foundation

func isCorrectly(_ str: [Character]) -> Bool {
    let list: [Character: Character] = [")": "(", "]": "[", "}": "{"]
    var stack: [Character] = []
    
    for char in str {
        if list.keys.contains(char) {
            if let top = stack.last, top == list[char]! {
                stack.popLast()    
            } else {
                return false
            }
        } else {
            stack.append(char)
        }
    }
    
    return stack.isEmpty
}

func solution(_ s:String) -> Int {
    var list: [Character] = Array(s)
    
    var count = 0
    (0..<s.count).forEach { _ in
        if isCorrectly(list) {
            count += 1
        }
        
        list.append(list.removeFirst())
    }
    
    return count
}

아직은 초보 개발자입니다.

더 효율적인 코드 훈수 환영합니다!

공감 댓글 부탁드립니다.

 

 

반응형