반응형
안녕하세요. 개발 중인 정주입니다.
오늘은 "프로그래머스(Lv.2) - 괄호 회전하기" 문제를 풀었습니다.
Github
문제 링크
풀이
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
}
아직은 초보 개발자입니다.
더 효율적인 코드 훈수 환영합니다!
공감과 댓글 부탁드립니다.
반응형