문제 소개
아래와 같이 ()로 이루어진 문자열이 주어졌을 때, 막대기는 몇조각으로 나뉠수 있는지를 물어보는 문제이다.
문제 풀이
텍스트 대치 활용
레이저를 "-" 로 바꿔준다음 "(" 가 나오게 된다면 막대기의 갯수를 더해주고, ")" 가 나오게 된다면 막대기의 갯수를 빼주고 count에 1을 더해주면 된다. 그리고 "-" 레이저가 나왔을때에는 총 조각의 count에 현재 막대기의 갯수를 더해준다. replacingOccurrences라는 것을 활용하면 쉽게 풀 수 있다.
import Foundation
let input = readLine()!.replacingOccurrences(of: "()", with: "-")
var bar = 0
var count = 0
for chr in input {
switch chr {
case "(":
bar += 1
case ")":
count += 1
bar -= 1
default:
count += bar
}
}
print(count)
스택 사용
위와 비슷한 원리이다. ")"가 나왔을때 바로앞이 "("라면 레이저로 생각한다.
import Foundation
let input = readLine()!
var stack = [String]()
var count = 0
for i in input.indices {
if input[i] == "(" {
stack.append(String(input[i]))
} else {
let index = input.index(i, offsetBy: -1)
if input[index] == "(" {
stack.removeLast()
count += stack.count
} else {
stack.removeLast()
count += 1
}
}
}
print(count)
가독성은 위에가 훨씬 좋지만 replacingOccurrences를 사용하면서 문자열이 길어질수록 좀더 시간이 걸릴 듯 싶다.
'→ Problems' 카테고리의 다른 글
[Algorithm] 백준 - 1918번 후위표기식 (postfix) (0) | 2024.04.14 |
---|---|
[Algorithm] 백준 - 17299번 오등큰수 (Swift) (0) | 2024.04.13 |
[Algorithm] 프로그래머스 - 디펜스 게임 (Swift) (Heap, Parametric Search) (0) | 2024.04.05 |
[Algorithm] 프로그래머스 - 시소 짝궁 (Swift) (0) | 2024.04.04 |
[Algorithm] 프로그래머스 - 뒤에 있는 큰 수 찾기 (Swift) (1) | 2024.04.03 |