-
4008.숫자 만들기알고리즘/SW Expert Academy 2020. 6. 19. 01:30
이번에 풀어볼 문제는 숫자 만들기이다. 오늘은 너무 피곤해서 아무것도 안하려다가 그래도 하나라도 풀자는 마음에
정답률이 높은 문제를 그냥 풀어보았다.. 근데 본의아니게 난이도가 매우 낮은 문제가 나왔다... 크흠..
이렇게 쉬운 문제가 나왔을 땐 다른 사람의 코드와 비교하면서 좀 더 쉬운방법이나 다양한 방법을 공부해야겠다.
이 문제는 한마디로 그냥 조합이다. 주어진 연산자와 숫자들을 가지고 조합만 할줄 알면 풀리는 간단한 문제이다.
딱히 중요한 설계도 필요없었던거 같다. 그냥 풀면된다. 알고리즘을 시작한지 얼마안된 사람이라면 풀어봄직하다!
( 물론 그렇다고 나의 코드가 깔끔하거나 대단한건아니다...ㅎㅎ )
< Code 설명 >
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
#pragma warning(disable:4996)#include <iostream>#include <deque>#include <algorithm>using namespace std;int T, N, d, b, g, n; // 테스트케이스, 숫자갯수, 더하기, 빼기, 곱하기, 나누기 변수deque<int> num; // 숫자가 저장되는 dequedeque<char>giho; // 연산자가 저장되는 dequeint main(){freopen("4008.txt", "r", stdin);cin >> T;for (int z = 1; z <= T; z++){cin >> N;cin >> d >> b >> g >> n;num.clear(); // 초기화giho.clear();// 초기화while (d + b + g + n != 0){ // 연산자들을 deque에 담는다.if (d){giho.push_back('+');d--;}else if (b){giho.push_back('-');b--;}else if (g){giho.push_back('*');g--;}else if (n){giho.push_back('/');n--;}}int tmp;for (int i = 0; i < N; i++){ // 숫자저장cin >> tmp;num.push_back(tmp);}sort(giho.begin(), giho.end()); // permutation을 하려면 정렬을 해주어야 한다!! 빼먹으면 안됨int mx = -987654321; // 최대값 변수int mn = 987654321; // 최소값 변수int sum = 0; //계산 결과do{sum = num[0]; // 첫 값은 그냥 저장for (int i = 0; i < giho.size(); i++){ // 기호의 크기만큼 돌림if (giho[i] == '+')sum += num[i + 1];else if (giho[i] == '-')sum -= num[i + 1];else if (giho[i] == '*')sum *= num[i + 1];else if (giho[i] == '/')sum /= num[i + 1];}if (mx < sum) // 최대mx = sum;if (mn > sum) // 최소mn = sum;sum = 0;} while (next_permutation(giho.begin(), giho.end())); // 순열이 있다면 계속 진행cout << "#" << z << " " << mx - (mn) << endl; // 최대와 최소의 차이}return 0;}cs
< Code 설명 - 재귀 사용 >
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
#pragma warning(disable:4996)#include <iostream>#include <algorithm>#define MAX 13using namespace std;int T, N;int yun[4];int p_yun[MAX];int max_ans;int min_ans;void check(int cnt, int num){ // 계산함수(계산 숫자 카운트, 합산 숫자)if (cnt == N){ //숫자의 계산이 모두 끝나면max_ans = max(max_ans, num); // 최댓값 구함min_ans = min(min_ans, num); // 최솟값 구함return;}else{if (yun[0]){ // ' + 'yun[0]--; // 해당 연산자 -1check(cnt + 1, num + p_yun[cnt]); // 연산수 +1, 해당연산자로 연산 진행, 재귀yun[0]++; // 다른 조합을 위해 다시 연산자 채워놓음}if (yun[1]){ // ' - 'yun[1]--; // 해당 연산자 -1check(cnt + 1, num - p_yun[cnt]); // 연산수 +1, 해당연산자로 연산 진행, 재귀yun[1]++; // 다른 조합을 위해 다시 연산자 채워놓음}if (yun[2]){ // ' * 'yun[2]--; // 해당 연산자 -1check(cnt + 1, num * p_yun[cnt]); // 연산수 +1, 해당연산자로 연산 진행, 재귀yun[2]++; // 다른 조합을 위해 다시 연산자 채워놓음}if (yun[3]){ // ' / 'yun[3]--; // 해당 연산자 -1check(cnt + 1, num / p_yun[cnt]); // 연산수 +1, 해당연산자로 연산 진행, 재귀yun[3]++; // 다른 조합을 위해 다시 연산자 채워놓음}}}int main() {freopen("4008.txt", "r", stdin);cin >> T;for (int z = 1; z <= T; z++){cin >> N;for (int i = 0; i < 4; i++)cin >> yun[i]; // 연산자 입력for (int i = 0; i < N; i++)cin >> p_yun[i]; // 피연산자 입력max_ans = -987654321; // 최대min_ans = 987654321; // 최소check(1, p_yun[0]); // 사용된 p_yun의 갯수, 첫 시작숫자(합산) 인자로 함수호출cout << "#" << z << " " << max_ans - (min_ans) << endl;}return 0;}cs 반응형'알고리즘 > SW Expert Academy' 카테고리의 다른 글
2105.디저트 카페 (0) 2020.06.27 2115.벌꿀채취 (0) 2020.06.23 5658.보물상자 비밀번호 (0) 2020.06.18 1767.프로세서 연결하기 (0) 2020.06.16 5650.핀볼 게임 (0) 2020.06.14 댓글