https://www.acmicpc.net/problem/10799
여러 개의 쇠막대기를 레이저로 절단하려고 한다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자른다. 쇠막대기와 레이저의 배치는 다음 조건을 만족한다.
아래 그림은 위 조건을 만족하는 예를 보여준다. 수평으로 그려진 굵은 실선은 쇠막대기이고, 점은 레이저의 위치, 수직으로 그려진 점선 화살표는 레이저의 발사 방향이다.
이러한 레이저와 쇠막대기의 배치는 다음과 같이 괄호를 이용하여 왼쪽부터 순서대로 표현할 수 있다.
위 예의 괄호 표현은 그림 위에 주어져 있다.
쇠막대기는 레이저에 의해 몇 개의 조각으로 잘리는데, 위 예에서 가장 위에 있는 두 개의 쇠막대기는 각각 3개와 2개의 조각으로 잘리고, 이와 같은 방식으로 주어진 쇠막대기들은 총 17개의 조각으로 잘린다.
쇠막대기와 레이저의 배치를 나타내는 괄호 표현이 주어졌을 때, 잘려진 쇠막대기 조각의 총개수를 구하는 프로그램을 작성하시오.
한 줄에 쇠막대기와 레이저의 배치를 나타내는 괄호 표현이 공백없이 주어진다. 괄호 문자의 개수는 최대 100,000이다.
잘려진 조각의 총개수를 나타내는 정수를 한 줄에 출력한다.
쇠막대기(오랫동안 풀지 못했던) 문제이다.
'()'에서 레이저가 나오는데 이 레이저가 쇠막대기를 자르고 그 쇠막대기의 개수를 구하는 문제이다.
이 문제를 풀기 위해선 문제에서 원하는 규칙을 찾아야 하는데 '()'가 나오면 이전에 나온 '('에 대해선 +1 ')'에 대해선 -1을
한 누적 pipe개수를 정답에 넣어준다. 다만 레이저 발사 이후에 '('없이 ')'가 나온 경우라면 누적 pipe개수는 원래처럼 -1을 해주고
정답에는 그 파이프가 '떨어져 나간' 파이프 하나이기 때문에 +1을 해주는 코드를 구성하도록 한다.
아래와 같이 풀어도 되지만 입력을 받은 후 replace를 사용해 '()'를 다른 임의의 문자로 바꾼 후 그 문자가 나왔을 때를
레이저 기점으로 문제를 해결할 수도 있다.
import sys
input = sys.stdin.readline
s = input().rstrip()
answer = 0
pipe = 0
flag = False
for i in s:
if i == '(':
flag = True
pipe += 1
elif i == ')' and flag:
pipe -= 1
answer += pipe
flag = False
elif i == ')' and not flag:
pipe -= 1
answer += 1
print(answer)
요즘 자바와 스프링에 허덕이고 있어 정신이 없어서 블로그 활동이 좀 뜸했지만 자료구조와 자바 학습은 복습 시에 정리한 자료를 좀 시간 내서 포스팅을 해놔야겠다..!(슾흐링 너 무 어려 워 요)
[백준_1953_사과나무] 골드5 python (0) | 2022.08.25 |
---|---|
[백준 5014] 스타트링크_python[BFS] (0) | 2022.06.19 |
[백준_python] 2776 암기왕 (0) | 2022.05.15 |
[백준_python] 동물원 1309 DP(Topdown,Bottomup) (0) | 2022.05.12 |
[백준 python] 15970 화살표그리기 (0) | 2022.05.10 |
댓글 영역