-
[Swift] 알고리즘 공부 - 올바른 괄호알고리즘 공부/프로그래머스 2024. 1. 18. 22:50
문제 설명
괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어
- "()()" 또는 "(())()" 는 올바른 괄호입니다.
- ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.
'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.
제한조건
- 문자열 s의 길이 : 100,000 이하의 자연수
- 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다
입출력 예
s answer "()()" true "(())()" true ")()(" false "(()(" false 설명
1. 괄호가 올바르게 열리고 닫혀있는지 확인하는 방법은 "("와 ")"의 갯수가 같아야한다. ansCount변수를 만들어 괄호의 수를 count할 수 있게 한다.
2. 몇가지 경우를 따져봐야 한다. 괄호의 갯수가 같아도 처음 시작 괄호가 ")" 이거나 끝나는 괄호가 "(" 라면 올바르게 열리고 닫혀 있는 괄호가 될 수 없기 때문에 if문으로 예외 처리를 해주었다. (3번째 입출력 예 참고)
3. 괄호의 수가 같고 첫 괄호와 마지막 괄호도 잘 정해졌어도 고려해야 하는 경우가 있다. 예를 들어서 "())(()"같은경우는 1,2번에서 설명한 내용을 지켰어도 올바른 괄호가 아니다. 그래서 ansCount를 "(" 일경우에는 +1, ")"일 경우에는 -1을 해주고 ansCount가 음수가 되면 "())(()"의 경우가 됐기 때문에 false를 리턴해 준다.
import Foundation func solution(_ s:String) -> Bool { var arrayS = Array(s) var ansCount = 0 if arrayS[0] == "(" && arrayS[arrayS.count - 1] == ")" { for i in arrayS { if i == "(" { ansCount += 1 } else if i == ")" { if ansCount > 0 { ansCount -= 1 } else { return false } } } return ansCount == 0 } else { return false } }
코드가 많이 복잡해 보이는데 조금 더 깔끔하게 작성하면 좋을 것 같아서 수정해 보았다.
import Foundation func solution(_ s: String) -> Bool { var ansCount = 0 for char in s { if char == "(" { ansCount += 1 } else if char == ")" { if ansCount > 0 { ansCount -= 1 } else { return false } } } return ansCount == 0 }
'알고리즘 공부 > 프로그래머스' 카테고리의 다른 글
[Swift] 알고리즘 공부 - 다음 큰 숫자 (1) 2024.01.30 [Swift] 알고리즘 공부 - 이진 변환 반복하기 (0) 2024.01.23 [Swift] 알고리즘 공부 - 최댓값과 최솟값 (0) 2024.01.18 [Swift] 알고리즘 공부 - 최댓값과 최솟값 (1) 2023.12.05 [Swift] 알고리즘 공부 - 가장 큰 수 (1) 2023.12.05