문제 주소 : www.acmicpc.net/problem/16637
문제 확인
수식의 길이가 짧기 때문에 간단하게 dfs로 풀 수 있습니다.
계산한 값이 기록되어 있어야 하므로 스텍과 함께 탐색합니다.
풀이
괄호 연산자는 우선순위를 부여하는 연산이므로 스텍을 이용하여 우선순위에 따라 계산을 진행할 수 있습니다. dfs 완전 탐색 시 2가지의 탐색 경로가 있습니다.
- 현재 수식을 계산합니다. = 괄호 없이 진행 or 현재 수식에 괄호를 둠
- 현재 수식을 계산하지 않고 스텍에 넣어둡니다. = 다음 수식에 괄호를 둠
중복 괄호를 두지 않도록 bool 변수를 통해 전단계에서 괄호를 삽입하였다면 다음 단계에서는 괄호를 삽입하는 탐색은 넘어갑니다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
#include <cstdio>
char a[20], o[9];
int N, m = -0x7FFFFFFF, n[10], e=0;
inline int clc(char o, int x, int y){
switch(o){case '+':return x + y;case '-':return x - y;case '*':return x*y;}
}
void dfs(int c, bool f) {
if(c==N){
int v=n[0];
for(int i=0; i<e; i++) v=clc(o[i], v, n[i+1]);
if(v>m)m=v;
return;
}
if(f){
int t=n[e];
n[e]=clc(a[c],n[e],a[c + 1]-48);
dfs(c+2,false);
n[e]=t;
}
o[e]=a[c];
n[++e]=a[c+1]-48;
dfs(c+2,true);
e--;
}
int main(){
scanf("%d%s",&N,a);
n[0]=a[0]-48;
dfs(1,true);
printf("%d",m);
}
|
cs |
반응형
'알고리즘 문제 > [백준]' 카테고리의 다른 글
[백준] 1744 수 묶기 (0) | 2020.12.12 |
---|---|
[백준] 19236 청소년 상어 (0) | 2020.12.09 |
[백준] 14500번: 테트로미노 (0) | 2020.12.05 |
[백준] 16236번: 아기상어 (0) | 2020.12.05 |
[백준] 1157번: 단어공부 (0) | 2020.12.05 |