[level 4] Title: 사칙연산, Time: 123.27 ms, Memory: 10.7 MB -BaekjoonHub

This commit is contained in:
SSUM
2025-03-07 16:38:44 +09:00
parent 43ec3d5d89
commit 11318ca905
2 changed files with 115 additions and 0 deletions

View File

@@ -0,0 +1,86 @@
# [level 4] 사칙연산 - 1843
[문제 링크](https://school.programmers.co.kr/learn/courses/30/lessons/1843)
### 성능 요약
메모리: 10.7 MB, 시간: 123.27 ms
### 구분
코딩테스트 연습 > 동적계획법DynamicProgramming
### 채점결과
정확성: 55.6<br/>효율성: 44.4<br/>합계: 100.0 / 100.0
### 제출 일자
2025년 03월 07일 16:38:41
### 문제 설명
<p>사칙연산에서 더하기(+)는 결합법칙이 성립하지만, 빼기(-)는 결합법칙이 성립하지 않습니다.<br>
예를 들어 식 1 - 5 - 3은 연산 순서에 따라 다음과 같이 다른 결과를 가집니다.</p>
<ul>
<li>((1 - 5) - 3) = -7</li>
<li>(1 - (5 - 3)) = -1</li>
</ul>
<p>위 예시와 같이 뺄셈은 연산 순서에 따라 그 결과가 바뀔 수 있습니다.<br>
또 다른 예로 식 1 - 3 + 5 - 8은 연산 순서에 따라 다음과 같이 5가지 결과가 나옵니다.</p>
<ul>
<li>(((1 - 3) + 5) - 8) = -5</li>
<li>((1 - (3 + 5)) - 8) = -15</li>
<li>(1 - ((3 + 5) - 8)) = 1</li>
<li>(1 - (3 + (5 - 8))) = 1</li>
<li>((1 - 3) + (5 - 8)) = -5</li>
</ul>
<p>위와 같이 서로 다른 연산 순서의 계산 결과는 <code>[-15, -5, -5, 1, 1]</code>이 되며, 이중 최댓값은 1입니다.<br>
문자열 형태의 숫자와, 더하기 기호("+"), 뺄셈 기호("-")가 들어있는 배열 arr가 매개변수로 주어질 때, 서로 다른 연산순서의 계산 결과 중 최댓값을 return 하도록 solution 함수를 완성해 주세요.</p>
<h5>제한 사항</h5>
<ul>
<li>arr는 두 연산자 "+", "-" 와 숫자가 들어있는 배열이며, 길이는 3 이상 201 이하 입니다.
<ul>
<li>arr의 길이는 항상 홀수입니다.</li>
<li>arr에 들어있는 숫자의 개수는 2개 이상 101개 이하이며, 연산자의 개수는 (숫자의 개수) -1 입니다.</li>
<li>숫자는 1 이상 1,000 이하의 자연수가 문자열 형태로 들어있습니다.. (ex : "456")</li>
</ul></li>
<li>배열의 첫 번째 원소와 마지막 원소는 반드시 숫자이며, 숫자와 연산자가 항상 번갈아가며 들어있습니다.</li>
</ul>
<hr>
<h5>입출력 예</h5>
<table class="table">
<thead><tr>
<th>arr</th>
<th>result</th>
</tr>
</thead>
<tbody><tr>
<td>["1", "-", "3", "+", "5", "-", "8"]</td>
<td>1</td>
</tr>
<tr>
<td>["5", "-", "3", "+", "1", "+", "2", "-", "4"]</td>
<td>3</td>
</tr>
</tbody>
</table>
<h5>입출력 예시</h5>
<p>입출력 예 #1<br>
위의 예시와 같이 (1-(3+(5-8))) = 1 입니다.</p>
<p>입출력 예 #2<br>
(5-(3+((1+2)-4))) = 3 입니다.</p>
> 출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges

View File

@@ -0,0 +1,29 @@
import sys
def solution(arr):
num = []
odd = []
for i in range(0, len(arr), 2):
num.append(int(arr[i]))
for i in range(1, len(arr), 2):
odd.append(arr[i])
num_len = len(num)
dp_max = [[-sys.maxsize] * (num_len) for _ in range(num_len) ]
dp_min = [[sys.maxsize] * (num_len) for _ in range(num_len) ]
for i in range(num_len):
dp_max[i][i] = num[i]
dp_min[i][i] = num[i]
for l in range(2, num_len+1):
for i in range(num_len-l+1):
j = i + l -1
for k in range(i, j):
if odd[k] == '+':
dp_max[i][j] = max(dp_max[i][j], dp_max[i][k] + dp_max[k+1][j])
dp_min[i][j] = min(dp_min[i][j], dp_min[i][k] + dp_min[k+1][j])
else:
dp_max[i][j] = max(dp_max[i][j], dp_max[i][k] - dp_min[k+1][j])
dp_min[i][j] = min(dp_min[i][j], dp_min[i][k] - dp_max[k+1][j])
return dp_max[0][num_len-1]