SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
쇠막대기와 레이저를 괄호로 나타낸 문자열에서 쇠막대기와 레이저의 위치를 알아내 레이저로 자른 쇠막대기의 조각 수를 구하는 문제.
[제약 사항]
- 쇠막대기는 자신보다 긴 쇠막대기 위에만 놓일 수 있다.
- 쇠막대기를 다른 쇠막대기 위에 놓는 경우 완전히 포함되도록 놓되, 끝점은 겹치지 않도록 놓는다.
각 쇠막대기를 자르는 레이저는 적어도 하나 존재한다.
- 레이저는 어떤 쇠막대기의 양 끝점과도 겹치지 않는다.
- 레이저는 여는 괄호와 닫는 괄호의 인접한 쌍 “()” 으로 표현된다. 또한, 모든 “()”는 반드시 레이저를 표현한다.
- 쇠막대기의 왼쪽 끝은 여는 괄호 ‘(’ 로, 오른쪽 끝은 닫힌 괄호 ‘)’ 로 표현된다.
- 괄호 문자의 개수는 최대 100,000이다.
직전의 괄호와 현재괄호가 어떤 조합인지에 따라 4가지 경우로 나누어 풀이했다.
괄호를 한칸씩 이동하며,
bar
)를 하나 추가하고, 잘렸을 때 왼쪽부분에 해당하는 조각의 수(cnt
)도 하나 추가한다.cnt
에 bar
만큼 값을 더해준다.bar
)를 하나 감소시킨다.
최종적으로 조각의 수 cnt
를 출력
T = int(input())
for tc in range(1, T+1):
laser_bar = input()
bar = 0 # 현재 지점에서 막대기 개수 카운트
cnt = 0 # 잘린 조각 개수 카운트
isleft = False # 직전의 괄호가 여는 괄호였는지 표시하는 변수
for lb in laser_bar:
if lb == '(':
if isleft: # 직전의 괄호가 여는 괄호였을 경우 == bar
cnt += 1 # 레이저로 잘릴때 가장 왼쪽 조각 부분을 추가해줌
bar += 1 # 새로운 막대기가 시작되므로 막대기 개수 카운트 +1
isleft = True # 직전의 괄호가 여는괄호였다는 것을 표시
else:
if isleft: # 여는괄호 직후 닫힌괄호일 때 == laser
cnt += bar # 레이저로 잘린 오른쪽 조각 부분을 추가해줌
else:
bar -= 1 # 레이저가 아니라면 쇠막대기를 끝부분이므로 막대기 개수 카운트 -1
isleft = False # 직전의 괄호가 여는괄호가 아니었다는 것을 표시
print('#{} {}'.format(tc, cnt))
[SWEA] #1859 백만 장자 프로젝트.python(파이썬) (0) | 2021.08.18 |
---|---|
[SWEA] #4408 자기 방으로 돌아가기.python(파이썬) (0) | 2021.08.17 |
[SWEA] #5356 의석이의 세로로 말해요.python(파이썬) (0) | 2021.08.16 |
[SWEA] #1961 숫자 배열 회전.python(파이썬) (0) | 2021.08.15 |
[SWEA] #11736 평범한 숫자.python(파이썬) (0) | 2021.07.21 |