
오늘 문제는 일단 그림이 있어서 기피감이 들었던 문제입니다. 저는 이런쪽이 약한게 확실한 것 같네요. 실제로 문제를 풀 때도 오래걸렸습니다.
오늘 문제는 스택 자료 구조를 활용한 문제입니다. 살펴보겠습니다.
| 시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
|---|---|---|---|---|---|
| 1 초 | 256 MB | 55831 | 36208 | 26910 | 65.088% |
여러 개의 쇠막대기를 레이저로 절단하려고 한다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자른다. 쇠막대기와 레이저의 배치는 다음 조건을 만족한다.
아래 그림은 위 조건을 만족하는 예를 보여준다. 수평으로 그려진 굵은 실선은 쇠막대기이고, 점은 레이저의 위치, 수직으로 그려진 점선 화살표는 레이저의 발사 방향이다.

이러한 레이저와 쇠막대기의 배치는 다음과 같이 괄호를 이용하여 왼쪽부터 순서대로 표현할 수 있다.
위 예의 괄호 표현은 그림 위에 주어져 있다.
쇠막대기는 레이저에 의해 몇 개의 조각으로 잘려지는데, 위 예에서 가장 위에 있는 두 개의 쇠막대기는 각각 3개와 2개의 조각으로 잘려지고, 이와 같은 방식으로 주어진 쇠막대기들은 총 17개의 조각으로 잘려진다.
쇠막대기와 레이저의 배치를 나타내는 괄호 표현이 주어졌을 때, 잘려진 쇠막대기 조각의 총 개수를 구하는 프로그램을 작성하시오.
한 줄에 쇠막대기와 레이저의 배치를 나타내는 괄호 표현이 공백없이 주어진다. 괄호 문자의 개수는 최대 100,000이다.
잘려진 조각의 총 개수를 나타내는 정수를 한 줄에 출력한다.
()(((()())(())()))(())
17
(((()(()()))(())()))(()())
24
Olympiad > 한국정보올림피아드 > 한국정보올림피아드시․도지역본선 > 지역본선 2015 > 중등부 2번
Olympiad > 한국정보올림피아드 > 한국정보올림피아드시․도지역본선 > 지역본선 2015 > 초등부 3번
이 문제는 주어진 괄호 표현을 통해 쇠막대기와 레이저의 배치를 분석하여, 레이저로 잘린 쇠막대기의 총 개수를 계산하는 문제입니다. 문제에서 주어진 규칙에 따라 괄호를 해석해야 하며, 특히 레이저와 쇠막대기의 구분을 잘해야 합니다.
(의 위치를 저장하고, 닫는 괄호 )가 등장했을 때 처리하는 방식을 사용합니다.(는 현재 열려 있는 쇠막대기의 수를 의미하며, 이 값을 통해 레이저가 쇠막대기를 자를 때 잘린 조각의 수를 계산할 수 있습니다.()는 레이저를 나타내며, 이때 스택에서 (를 하나 빼고, 현재 스택의 크기(열려 있는 쇠막대기의 수)를 조각 수에 더합니다.()가 아닌 )가 나오면, 이는 쇠막대기의 끝을 의미하므로, 스택에서 (를 하나 빼고, 조각 수를 1 추가합니다. 이는 막대기의 끝 조각을 의미합니다.import sys
from collections import deque
stick = sys.stdin.readline().strip() # 입력된 괄호 문자열을 읽어옴
stack = deque() # 스택을 사용하기 위해 deque 자료구조 사용
cnt = 0 # 잘려진 조각의 총 개수를 저장할 변수
for i in range(len(stick)):
if stick[i] == '(': # 여는 괄호가 나오면
stack.append(i) # 스택에 현재 인덱스를 추가
else: # 만약 stick[i] == ')'
if stick[i-1] == '(': # 이전 문자가 여는 괄호면 이는 레이저
stack.pop() # 레이저이므로 스택에서 하나를 제거
cnt += len(stack) # 현재 스택에 있는 모든 막대기들을 자름
else: # 이전 문자가 닫는 괄호면 이는 쇠막대기의 끝
stack.pop() # 쇠막대기 끝이므로 스택에서 하나를 제거
cnt += 1 # 막대기 끝 조각을 추가
print(cnt) # 결과 출력
(가 나오면 스택에 그 위치를 추가합니다.)가 나오면 이전 문자를 확인하여 레이저인지, 쇠막대기 끝인지 구분합니다.()가 발견되면 스택에서 여는 괄호 (를 하나 제거하고, 현재 스택의 길이(열려 있는 쇠막대기의 수)를 조각 수에 더합니다.)가 나오면 스택에서 하나를 제거하고, 조각 수를 1 추가합니다. 이는 막대기의 마지막 조각을 의미합니다.이번 문제는 스택 자료 구조를 활용하여 해결할 수 있는 전형적인 문제였습니다. 괄호를 이용해 레이저와 쇠막대기의 시작과 끝을 표현한 방식이 조금 복잡하게 느껴질 수 있었지만, 스택을 사용하여 괄호의 짝을 맞추고 상황에 맞게 처리하는 방법으로 문제를 풀 수 있었습니다.
이 문제를 통해 자료 구조의 기본인 스택의 활용법과, 복잡해 보이는 문제를 단순한 규칙으로 풀어내는 사고 방식을 다시 한번 다질 수 있었습니다. 특히 스택의 활용은 다양한 알고리즘 문제에서 반복적으로 등장하는 중요한 테크닉이니, 이런 유형의 문제를 여러 번 연습해 두면 다른 문제에서도 유사한 접근법을 적용할 수 있을 것입니다.
읽어주셔서 감사합니다!

더 나은 개발자가 될거야!!💪