본문 바로가기
알고리즘/백준

[백준 14888] 연산자 끼워넣기 (C++)

by Bloofer 2020. 5. 8.

A. 문제설명

https://www.acmicpc.net/problem/14888

문제에 대한 자세한 설명은 링크 참조

 

1. N개의 수가 주어지고 그 사이에 N-1개의 연산자를 넣으려고 함

2. N개의 수에 대한 연산자의 조합은 다음과 같이 삽입될 수 있다.

  • 1+2+3-4×5÷6
  • 1÷2+3+4-5×6
  • 1+2÷3×4-5+6
  • 1÷2×3-4+5+6

3. N-1개의 연산자는 +, -, ×, ÷로 각각 사용할 수 있는 수가 주어짐

4. 연산식 조합 중 최대와 최소를 만드는 것을 구하면 됨

* (중요) 여기서 연산자 우선순위는 무시되고, 연산식은 좌에서 우의 순서로 계산되면 된다.

B. 접근법

DFS

주어진 연산자 갯수들을 이용하여 각 연산자들의 배치 조합을 DFS로 모두 만들고, 해당 연산식 중 최대와 최소를 업데이트하며 완전탐색한다.

 

* 만약 연산자 우선순위가 고려되어 평가한다면 스택을 이용하여 다음과 같이 구현할 수 있다.

요약하자면, 연산식을 평가할 때 좌에서 우로 스캔하며 낮은 우선순위의 연산자는 스택에 넣어 후순위로 연산하고, 높은 우선순위의 연산자는 선순위로 평가하여 스택에 그 결과를 삽입하는 것. 최종 결과는 크기 1인 스택의 Top에 남는 수.

참조: www.cis.upenn.edu/~matuszek/cit594-2014/Lectures/13-stacks.ppt

 

C. 풀이

1. DFS로 각 연산자들의 모든 배치 조합을 만듦

2. Base case(조합 완성) 도달 시, 해당 연산식을 평가하여 최대/최소 업데이트

 

D. 내 코드