March 28, 2020
쇠막대기와 쇠막대기를 자르는 레이저의 배치를 표현한 문자열 arrangement
가 주어질 때 쇠막대기 조각의 개수를 return 하세요.
arrangement
의 길이는 최대 100,000입니다.arrangement
의 여는 괄호와 닫는 괄호는 항상 쌍을 이룹니다.def solution(arrangement: str) -> int:
answer = 0
pipes = 0
is_laser = False
for a in arrangement:
if a == ")":
pipes -= 1 # 레이저인 경우에도 pipes의 값을 증가시켰기 때문에 항상 1을 빼준다.
if is_laser: # 레이저인 경우
answer += pipes # 이번 레이저로 생긴 조각수 추가
is_laser = False # 다시 닫는 괄호가 들어왔을 때는 레이저가 아님
else: # 쇠막대기의 끝
answer += 1
else: # 새로운 쇠막대기 또는 레이저
pipes += 1
is_laser = True # 다음 닫는 괄호는 레이저임
return answer
처음에는 스택을 생각하고 하다가 pipes
를 배열로 만들어서 했는데 일반 스택처럼 스택안에 들어있는 데이터로 작업이 필요한 게 아니라 단순히 카운팅만을 위한 스택이기 때문에(괜히 메모리만 증가시킨다.) 정수로 변경해서 계산했다.
class TestCase(unittest.TestCase):
def test_solution(self):
self.assertEqual(solution("()(((()())(())()))(())"), 17)
self.assertEqual(solution("()"), 0)
self.assertEqual(solution("(())((()()))"), 8)