728x90
반응형
https://programmers.co.kr/learn/courses/30/lessons/76502?language=swift#
그냥 쌩 구현 문제!
그냥 모든 값들을 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
반응형