Skip to content

Commit 0efd374

Browse files
committed
[level 4] Title: 사칙연산, Time: 26.81 ms, Memory: 54.7 MB -BaekjoonHub
1 parent 2c721e0 commit 0efd374

File tree

2 files changed

+140
-0
lines changed

2 files changed

+140
-0
lines changed
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
# [level 4] 사칙연산 - 1843
2+
3+
[문제 링크](https://school.programmers.co.kr/learn/courses/30/lessons/1843)
4+
5+
### 성능 요약
6+
7+
메모리: 54.7 MB, 시간: 26.81 ms
8+
9+
### 구분
10+
11+
코딩테스트 연습 > 동적계획법(Dynamic Programming)
12+
13+
### 채점결과
14+
15+
정확성: 55.6<br/>효율성: 44.4<br/>합계: 100.0 / 100.0
16+
17+
### 제출 일자
18+
19+
2025년 09월 18일 11:03:48
20+
21+
### 문제 설명
22+
23+
<p>사칙연산에서 더하기(+)는 결합법칙이 성립하지만, 빼기(-)는 결합법칙이 성립하지 않습니다.<br>
24+
예를 들어 식 1 - 5 - 3은 연산 순서에 따라 다음과 같이 다른 결과를 가집니다.</p>
25+
26+
<ul>
27+
<li>((1 - 5) - 3) = -7</li>
28+
<li>(1 - (5 - 3)) = -1</li>
29+
</ul>
30+
31+
<p>위 예시와 같이 뺄셈은 연산 순서에 따라 그 결과가 바뀔 수 있습니다.<br>
32+
또 다른 예로 식 1 - 3 + 5 - 8은 연산 순서에 따라 다음과 같이 5가지 결과가 나옵니다.</p>
33+
34+
<ul>
35+
<li>(((1 - 3) + 5) - 8) = -5</li>
36+
<li>((1 - (3 + 5)) - 8) = -15</li>
37+
<li>(1 - ((3 + 5) - 8)) = 1</li>
38+
<li>(1 - (3 + (5 - 8))) = 1</li>
39+
<li>((1 - 3) + (5 - 8)) = -5</li>
40+
</ul>
41+
42+
<p>위와 같이 서로 다른 연산 순서의 계산 결과는 <code>[-15, -5, -5, 1, 1]</code>이 되며, 이중 최댓값은 1입니다.<br>
43+
문자열 형태의 숫자와, 더하기 기호("+"), 뺄셈 기호("-")가 들어있는 배열 arr가 매개변수로 주어질 때, 서로 다른 연산순서의 계산 결과 중 최댓값을 return 하도록 solution 함수를 완성해 주세요.</p>
44+
45+
<h5>제한 사항</h5>
46+
47+
<ul>
48+
<li>arr는 두 연산자 "+", "-" 와 숫자가 들어있는 배열이며, 길이는 3 이상 201 이하 입니다.
49+
50+
<ul>
51+
<li>arr의 길이는 항상 홀수입니다.</li>
52+
<li>arr에 들어있는 숫자의 개수는 2개 이상 101개 이하이며, 연산자의 개수는 (숫자의 개수) -1 입니다.</li>
53+
<li>숫자는 1 이상 1,000 이하의 자연수가 문자열 형태로 들어있습니다.. (ex : "456")</li>
54+
</ul></li>
55+
<li>배열의 첫 번째 원소와 마지막 원소는 반드시 숫자이며, 숫자와 연산자가 항상 번갈아가며 들어있습니다.</li>
56+
</ul>
57+
58+
<hr>
59+
60+
<h5>입출력 예</h5>
61+
<table class="table">
62+
<thead><tr>
63+
<th>arr</th>
64+
<th>result</th>
65+
</tr>
66+
</thead>
67+
<tbody><tr>
68+
<td>["1", "-", "3", "+", "5", "-", "8"]</td>
69+
<td>1</td>
70+
</tr>
71+
<tr>
72+
<td>["5", "-", "3", "+", "1", "+", "2", "-", "4"]</td>
73+
<td>3</td>
74+
</tr>
75+
</tbody>
76+
</table>
77+
<h5>입출력 예시</h5>
78+
79+
<p>입출력 예 #1<br>
80+
위의 예시와 같이 (1-(3+(5-8))) = 1 입니다.</p>
81+
82+
<p>입출력 예 #2<br>
83+
(5-(3+((1+2)-4))) = 3 입니다.</p>
84+
85+
86+
> 출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import java.util.*;
2+
3+
class Solution {
4+
public int solution(String arr[]) {
5+
ArrayList<Integer> nums = new ArrayList<>();
6+
ArrayList<String> commends = new ArrayList<>();
7+
8+
for(String str : arr){
9+
try {
10+
nums.add(Integer.parseInt(str));
11+
} catch(Exception e) {
12+
commends.add(str);
13+
}
14+
}
15+
16+
int cnt = nums.size();
17+
18+
int[][] maxDp = new int[cnt][cnt];
19+
int[][] minDp = new int[cnt][cnt];
20+
21+
for(int i = 0; i < cnt; i ++) {
22+
maxDp[i][i] = nums.get(i);
23+
minDp[i][i] = nums.get(i);
24+
}
25+
26+
for(int length = 2; length <= cnt; length ++) { // 연산 길이
27+
for(int start = 0; start <= cnt - length; start ++) { // 시작
28+
int end = start + length - 1; // 끝
29+
30+
maxDp[start][end] = Integer.MIN_VALUE;
31+
minDp[start][end] = Integer.MAX_VALUE;
32+
33+
for(int i = start; i < end; i ++) { // 연산자 위치(분할 위치)
34+
String commend = commends.get(i);
35+
36+
if(commend.equals("+")) {
37+
// 최댓값 + 최댓값
38+
maxDp[start][end] = Math.max(maxDp[start][end], maxDp[start][i] + maxDp[i+1][end]);
39+
// 최솟값 + 최솟값
40+
minDp[start][end] = Math.min(minDp[start][end], minDp[start][i] + minDp[i+1][end]);
41+
} else{
42+
// 최댓값 - 최솟값
43+
maxDp[start][end] = Math.max(maxDp[start][end], maxDp[start][i] - minDp[i+1][end]);
44+
// 최솟값 - 최댓값
45+
minDp[start][end] = Math.min(minDp[start][end], minDp[start][i] - maxDp[i+1][end]);
46+
}
47+
}
48+
}
49+
}
50+
51+
int answer = maxDp[0][cnt-1];
52+
return answer;
53+
}
54+
}

0 commit comments

Comments
 (0)