[Algorithm] BaekJoon : 1541. 잃어버린 괄호 by Python

엄희관·2021년 3월 1일
0

Algorithm

목록 보기
107/128
post-thumbnail

[문제 바로가기] https://www.acmicpc.net/problem/1541

📌문제 설명

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

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

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

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

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

💡 문제 풀이

문제 난이도가 어렵지 않았지만 꼼꼼히 읽지 않아서 비효율적으로 코드를 만든 문제... → 반성의 의미로 글 남기기 😂

괄호 추가로 최대 혹은 최소값을 만드는 유형의 문제를 너무 많이 풀어서 습관적으로 코드를 작성한게 잘못이었다.

문제의 조건들이 있었지만 내가 확인한 건 '괄호를 추가하여 최소값 만들기'가 전부였다. 그렇다보니 아래와 같은 (비효율적인) 과정이 나왔다.

step 1)
먼저, eval()함수는 '013'과 같은 문자열을 넣었을 때 Syntax Error가 발생하므로 형변환으로 정리하였다.

step 2)
'+' 연산을 먼저 진행한 후 '-' 진행을 하는 것이 최소값이므로 식(given)에 '+'가 존재할 때 까지 아래의 반복문을 진행한다.

  1. index함수로 plus위치를 찾는다(다수일 경우 맨 앞의 '+'를 찾는다.)
  2. 해당 index를 기준으로 왼쪽, 오른쪽으로 이동하여 숫자를 찾는다.
  3. 문자열을 갱신한다. → given[:plus-len(left)] + str(int(left[::-1])+int(right)) + given[plus+len(right)+1:]

step 3)
문자열에 '+'가 없으면 남은 식은 eval()함수를 사용하여 처리한다.

코드는 다음과 같다.

처음 시도

rigin = input()
pm = '+-'
given, num = '', ''
for i in origin:
    if i not in pm:
        num += i
    else:
        given += str(int(num))
        given += i
        num = ''
given += str(int(num))
given.split('+')
while given.count('+'):
    plus = given.index('+')
    left, right = '', ''
    for idx in range(plus-1, -1, -1):
        if given[idx].isnumeric():
            left += given[idx]
        else:
            break
    for idx in range(plus+1, len(given)):
        if given[idx].isnumeric():
            right += given[idx]
        else:
            break
    given = given[:plus-len(left)] + str(int(left[::-1])+int(right)) + given[plus+len(right)+1:]
print(eval(given))

굳이 '+' 인덱스를 찾아서 왼쪽, 오른쪽 숫자를 찾아 계산할 필요가 없었다.

split() 함수로 '-', '+'를 순차적으로 분리한 후 계산하면 코드가 훨씬 짧아진다.

  1. '-' 기준으로 분리한다
  2. 분리한 맨 앞의 식은 '+' 기준으로 나누어 더해준다.(맨 앞은 숫자이므로 무조건 양수의 식이 들어가기 때문!) - 조건을 놓친 부분...😂
  3. 나머지 식은 '+' 연산을 진행한 후 총 합을 빼주기만 하면 된다.

코드는 다음과 같다.

수정한 코드

given = input().split('-')
s = 0
for i in given[0].split('+'):
    s += int(i)
for i in given[1:]:
    for j in i.split('+'):
        s -= int(j)
print(s)

코드 길이에 비해 시간, 메모리 차이는 별로 나지 않은게 신기했다...

profile
허브

0개의 댓글