it 취업을 위한 알고리즘 문제풀이 입문 : 85. 수식만들기(삼성 SW역량평가 기출문제 : DFS활용)
🙇♀️수식만들기(삼성 SW역량평가 기출문제 : DFS활용)
길이가 N인 자연수로 이루어진 수열이 주어집니다.
수열의 각 항 사이에 끼워넣을 N-1개의 연산자가 주어집니다.
연산자는 덧셈(+), 뺄셈(-), 곱셈(×), 나눗셈(÷)으로만 이루어져 있습니다.
수열의 순서는 그대로 유지한 채 각 항사이에 N-1개의 연산자를 적절히 배치하면 다양한 수식이 나옵니다.
예를 들면
수열이 1 2 3 4 5이고 덧셈(+) 1개, 뺄셈(-) 1개, 곱셈(×) 1개, 나눗셈(÷) 1개인 일 때 만들 수 있는 수식은 많은 경우가 존재한다.
그 중 1+2*3-4/5와 같이 수식을 만들었다면 수식을 계산하는 결과는 연산자 우선순위를 따지지 않고 맨 앞쪽 연산자부터 차례로 계산한다.
수식을 계산한 결과는 1이다.
N길이의 수열과 N-1개의 연산자가 주어지면 만들 수 있는 수식들 중에서 연산한 결과가 최대인것과 최소인것을 출력하는 프로그램을 작성하세요.
▣ 입력설명
첫째 줄에 수의 개수 N(2 ≤ N ≤ 10)가 주어진다.
둘째 줄에 수열이 주어진다.
수열의 값은 100까지이다.
셋째 줄에는 연산자의 각 개수가 차례대로 덧셈(+) 개수, 뺄셈(-) 개수, 곱셈(×) 개수, 나눗셈(÷) 개수로 주어진다.
연산자의 총 개수는 N-1이다.
▣ 출력설명
첫째 줄에는 최댓값을, 둘째 줄에는 최솟값을 출력한다.
▣ 입력예제 1
3
5 3 8
1 0 1 0
▣ 출력예제 1
64
23
🚀풀이
연산자의 개수가 총 4개이므로 DFS도 4갈래로 나가야한다.
연산자의 수가 주어졌으므로 연산자의 개수 역시 고려해야한다.
연산자를 사용하고 돌아갈 때는 연산자의 수를 되돌려줘야한다.
void DFS(int L, int res)
{
if (L == n)
{
maxRes = max(maxRes, res);
minRes = min(minRes, res);
}
else
{
if (signs[0] > 0)
{
signs[0]--;
DFS(L + 1, res + seq[L + 1]);
signs[0]++;
}
if (signs[1] > 0)
{
signs[1]--;
DFS(L + 1, res - seq[L + 1]);
signs[1]++;
}
if (signs[2] > 0)
{
signs[2]--;
DFS(L + 1, res * seq[L + 1]);
signs[2]++;
}
if (signs[3] > 0)
{
signs[3]--;
DFS(L + 1, res / seq[L + 1]);
signs[3]++;
}
}
}
연산자를 되돌려주는걸 생각하지 못했다… 아쉽다..
🚀전체 코드
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
int n, minRes = 123456789, maxRes = -1;
vector<int> seq;
int signs[4];
void setting()
{
cin >> n;
seq = vector<int>(n + 1);
for (int i = 1; i <= n; ++i)
cin >> seq[i];
for (int i = 0; i < 4; ++i)
cin >> signs[i];
}
void DFS(int L, int res)
{
if (L == n)
{
maxRes = max(maxRes, res);
minRes = min(minRes, res);
}
else
{
if (signs[0] > 0)
{
signs[0]--;
DFS(L + 1, res + seq[L + 1]);
signs[0]++;
}
if (signs[1] > 0)
{
signs[1]--;
DFS(L + 1, res - seq[L + 1]);
signs[1]++;
}
if (signs[2] > 0)
{
signs[2]--;
DFS(L + 1, res * seq[L + 1]);
signs[2]++;
}
if (signs[3] > 0)
{
signs[3]--;
DFS(L + 1, res / seq[L + 1]);
signs[3]++;
}
}
}
void solve()
{
setting();
DFS(1, seq[1]);
cout << maxRes << '\n';
cout << minRes << '\n';
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
//freopen("input.txt", "rt", stdin);
solve();
return 0;
}