diff --git a/프로그래머스/4/1843. 사칙연산/README.md b/프로그래머스/4/1843. 사칙연산/README.md new file mode 100644 index 0000000..d46978b --- /dev/null +++ b/프로그래머스/4/1843. 사칙연산/README.md @@ -0,0 +1,86 @@ +# [level 4] 사칙연산 - 1843 + +[문제 링크](https://school.programmers.co.kr/learn/courses/30/lessons/1843) + +### 성능 요약 + +메모리: 10.7 MB, 시간: 123.27 ms + +### 구분 + +코딩테스트 연습 > 동적계획법(Dynamic Programming) + +### 채점결과 + +정확성: 55.6
효율성: 44.4
합계: 100.0 / 100.0 + +### 제출 일자 + +2025년 03월 07일 16:38:41 + +### 문제 설명 + +

사칙연산에서 더하기(+)는 결합법칙이 성립하지만, 빼기(-)는 결합법칙이 성립하지 않습니다.
+예를 들어 식 1 - 5 - 3은 연산 순서에 따라 다음과 같이 다른 결과를 가집니다.

+ + + +

위 예시와 같이 뺄셈은 연산 순서에 따라 그 결과가 바뀔 수 있습니다.
+또 다른 예로 식 1 - 3 + 5 - 8은 연산 순서에 따라 다음과 같이 5가지 결과가 나옵니다.

+ + + +

위와 같이 서로 다른 연산 순서의 계산 결과는 [-15, -5, -5, 1, 1]이 되며, 이중 최댓값은 1입니다.
+문자열 형태의 숫자와, 더하기 기호("+"), 뺄셈 기호("-")가 들어있는 배열 arr가 매개변수로 주어질 때, 서로 다른 연산순서의 계산 결과 중 최댓값을 return 하도록 solution 함수를 완성해 주세요.

+ +
제한 사항
+ + + +
+ +
입출력 예
+ + + + + + + + + + + + + + + +
arrresult
["1", "-", "3", "+", "5", "-", "8"]1
["5", "-", "3", "+", "1", "+", "2", "-", "4"]3
+
입출력 예시
+ +

입출력 예 #1
+위의 예시와 같이 (1-(3+(5-8))) = 1 입니다.

+ +

입출력 예 #2
+(5-(3+((1+2)-4))) = 3 입니다.

+ + +> 출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges \ No newline at end of file diff --git a/프로그래머스/4/1843. 사칙연산/사칙연산.py b/프로그래머스/4/1843. 사칙연산/사칙연산.py new file mode 100644 index 0000000..0d420ca --- /dev/null +++ b/프로그래머스/4/1843. 사칙연산/사칙연산.py @@ -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] \ No newline at end of file