알고리즘/알고리즘_백준

[Python][백준] 1541. 잃어버린 괄호 / 수학, Greedy, 문자열 (S2)

Jerry_K 2024. 10. 1. 23:42

🔗링크 :  

https://www.acmicpc.net/problem/1541


🗒️파이썬 코드 풀이

import sys
input = sys.stdin.readline

S = input().split('-')

lst = []
for i in range(len(S)):
    lst.append(sum(list(map(int,S[i].split("+")))))

rs = lst[0]

for ls in lst[1:]:
    rs -= ls
print(rs)

 

1. 보통 입력은 split()으로 하는데, 이 문제의 경우 '-' 로 나눠준다.

(한 번 빼기가 시작되면 그 이후 모든 숫자가 한꺼번에 빼주는 것이 최소 값을 만드는 최선의 선택)

 

2. 한번 '-' 로 나눠준 lst를 이번에는 '+' 로 나눠주고, 

int 형으로 바꾸면서 sum을 해주고 lst에 붙여준다 .

( 로직이 길어서 어려워 보인데, 그냥 하나 하나 하면 간단하다 ...)

 

3. rs의 초기값은 lst[0]으로 만들어주고 순차적으로 뺴주면 된다. 

 

 

🔗 내 풀이 코드 

import sys

lst = list(input())
operations = ['+',"-"]
num = []
current = 0 
tmp = ""

while True : 
    
    if lst[current] in operations:
        num.append(int(tmp))
        num.append(lst[current])
        tmp = ""
        current += 1
        continue

    tmp += lst[current]
    current += 1

    if current == len(lst):
        num.append(int(tmp))
        break

rs = []
hap = 0
for i in range(len(num)) :
    if num[i] == "-":
        rs.append(hap)
        rs.append(num[i])
        hap = 0
    elif num[i] == "+":
        continue
    else:
        hap += num[i]
        if  i == len(num)-1:
            rs.append(hap)

rrs = rs[0]
if len(rs)== 1 : 
    print(rs[0])
else: 
    for i in range(1,len(rs)-1) :
        if rs[i] == "-" :
            rrs -= rs[i+1]
    print(rrs)

 

흠 ... "+", "-" 를 나눠주고, 반복문하고 ....

뭐 정답은 통과한 문제이지만 ....

너무 지저분하고 복잡한 코드이다. 

 

 

📌 문제 코멘트 

막 어렵거나 한 문제는 아니다. 

간단하게 구현을 통해 가능한데, 새벽에 풀어서 그런지 새벽 감성 넘치게 쓴 코드이다... 

 

한가지 좀 기억 할 것은 

split()은 단지 입력을 분할을 위한 함수가 아니고, 

다른 리스트 분할 해주는데도 쓰인다. 

이 부분을 생각하지 못해서 while 문까지 쓰면서 지저분하게 작성한 코드이다. 

 


📚문제

세준이는 양수와 +, -, 그리고 괄호를 가지고 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다.

그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다.

괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.

입력

첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 많이 연속되는 숫자는 없다. 수는 0으로 시작할 수 있다. 입력으로 주어지는 식의 길이는 50보다 작거나 같다.

출력

첫째 줄에 정답을 출력한다.

예제 입력 1 복사

55-50+40

예제 출력 1 복사

-35

예제 입력 2 복사

10+20+30+40

예제 출력 2 복사

100

예제 입력 3 복사

00009-00009

예제 출력 3 복사

0

출처