SMALL
문제



코드
import sys
input = sys.stdin.readline
if __name__ == "__main__":
lines = input().strip()
stick = 0
cnt = 0
for i in range(len(lines)):
if lines[i] == "(":
stick += 1
else: # )
stick -= 1
if lines[i - 1] == "(": # 레이저
cnt += stick
else: # 막대기
cnt += 1
print(cnt)
stick은 현재 열려 있는 쇠막대기 개수, cnt는 최종 조각 개수이다.
( 를 만났을 때에는 새로운 막대기가 시작되므로 (혹은 레이저의 시작 후보), 현재 열려있는 막대기 수에다가 1을 더한다.
if lines[i] == "(":
stick += 1
) 를 만나게 되었을 때에는 막대기 끝이나 레이저나 무조건 하나를 닫는 역할이기에 현재 열려 있는 쇠막대기 개수 중 하나를 제거한다.
else:
stick -= 1
이제 레이저인지 판단한다. ) 일때 바로 앞 문자열이 ( 이면 레이저이기 때문이다.
따라서 레이저라면 현재 열려 있는 모든 막대기를 자르므로 레이저를 제외한 진짜 막대기 개수를 더한다.
if lines[i-1] == "(":
cnt += stick
레이저가 아닌 막대기 끝이라면 막대기 하나가 끝나므로, 마지막 조각 1개를 추가한다.
else:
cnt += 1
예제
만약 입력이 아래와 같을때,
()(((()())(())()))(())
아래와 같이 수행된다.
(
→ stick = 1
()
→ stick = 0
→ 레이저 → cnt += 0
(
→ stick = 1
(
→ stick = 2
정리
반복하면서:
( → 막대기 시작 → stick += 1
) → 하나 닫음 → stick -= 1
바로 앞이 ( → 레이저 → cnt += stick
바로 앞이 ) → 막대기 끝 → cnt += 1
솔직히 나는 풀기 어려웠다. 일단 문제 자체를 이해하기 어려워서 챗 선생과 과외를 진행했다.
독해력이란 게 전부인 것 같다..
LIST
'CODE > Algorithm (Python)' 카테고리의 다른 글
| BOJ 2161 카드1 (0) | 2026.04.28 |
|---|---|
| BOJ 1406 에디터 (0) | 2026.04.28 |
| BOJ 3986 좋은 단어 (0) | 2026.04.28 |
| BOJ 1544 사이클 단어 (0) | 2026.04.28 |
| BOJ 4485 녹색 옷 입은 애가 젤다지? (0) | 2026.04.28 |