1541번: 잃어버린 괄호
첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다
www.acmicpc.net
문제
세준이는 양수와 +, -, 그리고 괄호를 가지고 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다.
그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다.
괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.
입력
첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 많이 연속되는 숫자는 없다. 수는 0으로 시작할 수 있다. 입력으로 주어지는 식의 길이는 50보다 작거나 같다.
출력
첫째 줄에 정답을 출력한다.
코드
exp = input().split('-') # - 기준으로 잘라줌
def calculate(exp):
res = 0
tmp = 0
for c in exp:
if c.isdecimal():
tmp *= 10
tmp += int(c)
else: # +인 경우
res += tmp
tmp = 0
if tmp != 0:
res += tmp
return res
if len(exp) == 1:
print(calculate(exp[0]))
exit()
ans = calculate(exp[0])
for e in exp[1:]:
ans -= calculate(e)
print(ans)
'-`가 나오면 다시 '-' 가 나오거나 수식이 끝날 때까지 모두 괄호를 쳐서 빼면 우리는 수식의 값을 최소로 만들 수 있다.
그러므로 수식을 입력받을 때 '-'를 기준으로 잘라준다. 이렇게 해서 첫번째 원소에서 뒤의 나머지 원소들의 값을 모두 빼줄 것이다.
`split()` 함수의 인자로 구분자을 넣어주면 그걸 기준으로 문자열을 잘라서 리스트로 리턴해준다.
`calculate()` 함수는 잘라진 수식을 계산하기 위한 함수이다. 잘라진 수식들은 무조건 숫자 단독이거나 더하기 연산만 있다.파라미터로 받은 수식에 대해 반복문을 돌며 식의 값을 계산할 것이다.
- 보고 있는 문자 `c`가 수라면 `tmp`에 10을 곱하고 $tmp += int(c)$
- 보고 있는 문자 `c`가 문자, 즉, '+' 기호라면 `res` 값에 지금까지 계산된 `tmp` 값을 더해주고 `tmp` 값을 0으로 초기화해준다.
- 마지막에 `tmp`값이 0이 아니라면 한 번 더 계산해주고 `res` 값을 리턴한다.
뺄셈이 아예 나오지 않았던 식이라면 `exp`의 길이가 1일 것이므로 이 경우 `exp[0]`을 `()` 함수를 이용하여 계산해주고 끝낸다.
그게 아니라면 `exp[0]`의 값에서 exp 배열의 나머지 원소들 식의 값을 모두 빼준다.
처음에는 파이썬의 `eval()` 함수를 이용하여 다음과 같이 풀이하려고 하였다.
- `eval()` 함수는 문자열로 된 표현식을 파라미터로 넣어주면 식의 결과값을 리턴해주는 함수이다. 수식뿐만 아니라 함수 등도 된다.
exp = input().split('-')
ans = eval(exp[0])
if len(exp) > 1:
for e in exp[1:]:
ans -= eval(e)
print(ans)
위의 코드는 00009-00009 이러한 입력을 넣어주었을 때
SyntaxError: leading zeros in decimal integer literals are not permitted; use an 0o prefix for octal integers
위와 같은 오류가 발생한다.
읽어보니 10진수 정수는 0으로 시작하는 것을 허용하지 않기 때문이라고 한다.
앞의 0을 처리해줄 수도 있겠지만 번거로워서 하지 않았다.
'문제풀이 > Greedy' 카테고리의 다른 글
[Python/파이썬] 백준 2141번 우체국 (0) | 2023.05.24 |
---|---|
[Python/파이썬] 백준 13305번 주유소 (0) | 2023.02.14 |
[Python/파이썬] 백준 11047번 동전 0 (0) | 2023.02.08 |
[Python/파이썬] 백준 11508번 2+1 세일 (0) | 2023.02.08 |
[Python/파이썬] 백준 11399번 ATM (0) | 2023.02.08 |