
글에 작성하는 더하기, 빼기 기호는 \를 붙여 표현했다. 이 문제는 두가지 방법으로 풀었다. 문자열로 생각하고 \- 기준으로 나눈 배열을 순회하면서 빼기연산을 적절히 수행해주는 코드와, 정규식을 가지고 패턴을 찾아서 모든 결과 문자열을 가지고 빼기연산을 하는 로직이다. 우선 간단한 첫번째 방법을 살펴보자.
# - 기호 기준으로 문자열을 잘라준다.
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과 같은 \-뒤에 숫자하나가 올때를 고려하지 않은 것이다. 그래서 그 기준도 추가해주었다. 마지막으로 앞에서 숫자하나만 등장하는 경우를 잡지 못해서 하나의 숫자가 앞에 있을때의 룰을 더해주었다.
해놓고 보니 패턴을 고려하는 경우, 그 패턴이 뚜렷하지 않은 이상 문자열로서 반례가 많기 때문에 그리디하게 접근하는게 나을 거라고 생각했다. 정규식을 이렇게 사용하는 경우에서는 비효율적인 것으로 보인다.
의견 및 피드백은 언제나 환영합니다 :)
| 2022 KAKAO TECH INTERNSHIP - 3. 코딩 테스트 연습 (0) | 2022.09.05 |
|---|---|
| [7579] 앱 (백준) (0) | 2022.09.03 |
| [1325] 효율적인 해킹 (백준) (0) | 2022.07.06 |
| [1053] 팰린드롬 공장 (백준) (0) | 2022.06.26 |
| [1059] 좋은 구간 (백준) (0) | 2022.06.23 |
댓글 영역