Study hard
(c++)백준 16637번: 괄호 추가하기 본문
16637번: 괄호 추가하기
첫째 줄에 수식의 길이 N(1 ≤ N ≤ 19)가 주어진다. 둘째 줄에는 수식이 주어진다. 수식에 포함된 정수는 모두 0보다 크거나 같고, 9보다 작거나 같다. 문자열은 정수로 시작하고, 연산자와 정수가
www.acmicpc.net

[풀이]
dfs를 이용하여 풀 수 있는 문제였다.
괄호를 묶을 수 있는지 확인하는 것이 필요하다.
1. 괄호 묶을 수 있는지 확인(남은 개수 확인)
2. 현재까지 계산한 값과 다음 값 사이의 연산자 저장
3. 괄호를 묶는 경우. 괄호 묶은 연산자 계산하고 이전까지의 값과 계산
4. 괄호를 묶지 않는 경우. 현재 위치의 값과 이전까지의 값 계산
※Max값 초기화할 때 습관적으로 -1 했다가 "틀렸습니다." 나옴, climits 라이브러리의 INT_MIN으로 초기화해주기!!
#include <iostream>
#include <algorithm>
#include <string>
#include <climits>
using namespace std;
int N;
string s;
int Max = INT_MIN;
int getResult(int x, int y, int op) {
if (op == '+') {
return x + y;
}
else if (op == '-') {
return x - y;
}
else if (op == '*') {
return x * y;
}
}
void dfs(int idx, int num) {
char op;
//마지막 연산자까지 봤을 때
if (idx > N - 1) {
Max = max(Max, num);
return;
}
//지금까지 계산한 값과 현재 위치 사이의 연산자 확인
if (idx == 0) {
op = '+';
}
else
op = s[idx - 1];
//괄호로 묶는 경우
if (idx + 2 < N) {
//현재까지 값과 괄호로 묶은 값 사이 연산자로 계산
int New = getResult(s[idx] - '0', s[idx + 2] - '0', s[idx + 1]);
dfs(idx + 4, getResult(num, New, op));
}
//괄호로 묶지 않는 경우
dfs(idx + 2, getResult(num, s[idx] - '0', op));
}
void solution() {
cin >> N >> s;
dfs(0, 0);
cout << Max << '\n';
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0);
solution();
return 0;
}
'백준 > bfs, dfs' 카테고리의 다른 글
(c++)백준 17145번: 캐슬 디펜스 (0) | 2020.10.12 |
---|---|
(c++)백준 17070번: 파이프 옮기기 1 (0) | 2020.10.11 |
(c++)백준 16928번: 뱀과 사다리 게임 (0) | 2020.09.05 |
(c++)백준 14395번: 4연산 (0) | 2020.09.04 |
(c++)백준 10026번: 적록색약 (0) | 2020.09.03 |