상세 컨텐츠

본문 제목

[1541] 잃어버린 괄호 (백준)

알고리즘 문제풀이

by DeepinDev 2022. 7. 10. 03:47

본문

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

 글에 작성하는 더하기, 빼기 기호는 \를 붙여 표현했다. 이 문제는 두가지 방법으로 풀었다. 문자열로 생각하고 \- 기준으로 나눈 배열을 순회하면서 빼기연산을 적절히 수행해주는 코드와, 정규식을 가지고 패턴을 찾아서 모든 결과 문자열을 가지고 빼기연산을 하는 로직이다. 우선 간단한 첫번째 방법을 살펴보자.

 

# - 기호 기준으로 문자열을 잘라준다.
temp = input().split('-')
nums = []

# 잘라준 문자열을 순회한다.
for sp in temp:
    total = 0
    # 순회하면서 +가 등장하는 문자열은 +로 나누고 더해준다.
    for i in sp.split('+'):
        total += int(i)
    nums.append(total)       # 결과를 준비한 배열에 모은다.

# 첫숫자를 기준으로 - 연산만 수행
ans = nums[0]
for i in range(1, len(nums)):
    ans -= nums[i]
print(ans)

 

두번째로 이 문제를 풀었을때는 정규식으로 접근했다. 우선 코드를 보자.

import re
stat = input()
def main():
    sums = re.findall(r'\d+[\+\d+]+|(?<=\-)\d+[\+\d+]+|(?<=\-)\d+|\d+', stat)
    if '-' not in stat:
        print(sum(map(int, stat.split('+'))))
        return
    sums = list(map(lambda x: sum(map(int, x.split('+'))), sums))
    if stat[0] == '-':
        res = sum(sums)*(-1)
    else:
        res = sum(sums[1:])*(-1)+sums[0]
    print(res)
if __name__ == '__main__':
    main()

 

처음에는 \+와 \-의 패턴이 있을 것이라고 보고 \- 뒤에 오는 덧셈의 반복을 떠올렸다. 예를 들면 -1+2+1과 같이 \- 뒤에 덧셈으로 연속한 연산은 괄호로 묶어 음수로 바꿀수 있기 때문이다. 하지만 문제가 발생했다. 이렇게 표현하니 처음에 - 없이 바로 오는 덧셈을 잡지 못했다. 그래서 -가 앞에 오지 않더라도 덧셈이 반복되면 패턴이라고 보았다. 하지만 또 다른 문제 발생. -1과 같은 \-뒤에 숫자하나가 올때를 고려하지 않은 것이다. 그래서 그 기준도 추가해주었다. 마지막으로 앞에서 숫자하나만 등장하는 경우를 잡지 못해서 하나의 숫자가 앞에 있을때의 룰을 더해주었다.

 

해놓고 보니 패턴을 고려하는 경우, 그 패턴이 뚜렷하지 않은 이상 문자열로서 반례가 많기 때문에 그리디하게 접근하는게 나을 거라고 생각했다. 정규식을 이렇게 사용하는 경우에서는 비효율적인 것으로 보인다. 

 

의견 및 피드백은 언제나 환영합니다 :)

관련글 더보기

댓글 영역