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 - 5) - 3) = -7
+- (1 - (5 - 3)) = -1
+
+
+위 예시와 같이 뺄셈은 연산 순서에 따라 그 결과가 바뀔 수 있습니다.
+또 다른 예로 식 1 - 3 + 5 - 8은 연산 순서에 따라 다음과 같이 5가지 결과가 나옵니다.
+
+
+- (((1 - 3) + 5) - 8) = -5
+- ((1 - (3 + 5)) - 8) = -15
+- (1 - ((3 + 5) - 8)) = 1
+- (1 - (3 + (5 - 8))) = 1
+- ((1 - 3) + (5 - 8)) = -5
+
+
+위와 같이 서로 다른 연산 순서의 계산 결과는 [-15, -5, -5, 1, 1]이 되며, 이중 최댓값은 1입니다.
+문자열 형태의 숫자와, 더하기 기호("+"), 뺄셈 기호("-")가 들어있는 배열 arr가 매개변수로 주어질 때, 서로 다른 연산순서의 계산 결과 중 최댓값을 return 하도록 solution 함수를 완성해 주세요.
+
+제한 사항
+
+
+- arr는 두 연산자 "+", "-" 와 숫자가 들어있는 배열이며, 길이는 3 이상 201 이하 입니다.
+
+
+- arr의 길이는 항상 홀수입니다.
+- arr에 들어있는 숫자의 개수는 2개 이상 101개 이하이며, 연산자의 개수는 (숫자의 개수) -1 입니다.
+- 숫자는 1 이상 1,000 이하의 자연수가 문자열 형태로 들어있습니다.. (ex : "456")
+
+- 배열의 첫 번째 원소와 마지막 원소는 반드시 숫자이며, 숫자와 연산자가 항상 번갈아가며 들어있습니다.
+
+
+
+
+입출력 예
+
+
+| arr |
+result |
+
+
+
+| ["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