hwooo
BOJ (C/C++) 14888번: 연산자 끼워넣기 본문
https://www.acmicpc.net/problem/14888
14888번: 연산자 끼워넣기
첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수,
www.acmicpc.net

풀이
백트래킹을 사용, 모든 경우의 수를 계산함.코드
#include <stdio.h>
#include <vector>
#include <limits.h>
using namespace std;
vector<int> V;
vector <char> Op, Seq;
bool visited[100];
int N;
int Min = INT_MAX, Max = INT_MIN;
int Cal() {
int res = V[0];
char op;
for (int i = 1; i < N; i++) {
op = Seq[i - 1];
if (op == '+') res += V[i];
else if (op == '-') res -= V[i];
else if (op == '*') res *= V[i];
else if (op == '/') res /= V[i];
}
return res;
}
void Get(int s) {
if (Seq.size() == s) { // 연산자가 N-1개가 되면 min, max 계산
int res = Cal();
if (Min > res) Min = res;
if (Max < res) Max = res;
return;
}
for (int i = 0; i < s; i++) {
char c = Op[i];
if (!visited[i]) {
visited[i] = true;
Seq.push_back(c);
Get(s);
visited[i] = false;
Seq.pop_back();
}
}
}
int main() {
int n, op[4];
char c;
scanf("%d", &N);
for (int i = 0; i < N; i++) {
scanf("%d", &n);
V.push_back(n);
}
for (int i = 0; i < 4; i++) {
if (i == 0) c = '+';
else if (i == 1) c = '-';
else if (i == 2) c = '*';
else c = '/';
scanf("%d", &op[i]);
for (int j = 0; j < op[i]; j++) Op.push_back(c); // 연산자 벡터에 저장
}
Get(N - 1);
printf("%d\n%d", Max, Min);
return 0;
}
'Study > Algorithm' 카테고리의 다른 글
BOJ (C/C++) 15828번: Router (0) | 2022.10.28 |
---|---|
BOJ (C/C++) 14889번: 스타트와 링크 (0) | 2022.10.28 |
BOJ (C/C++) 1018번: 체스판 다시 칠하기 (0) | 2022.10.27 |
BOJ (C/C++) 2563번: 색종이 (0) | 2022.10.26 |
BOJ (C/C++) 2566번: 최댓값 (0) | 2022.10.26 |