문제
https://www.acmicpc.net/problem/14888
풀이
DFS로 연산자 순서를 전부 구해서 계산을 해주면 된다. 설명은 주석으로 대체하겠다.
// // 14888.cpp // BJ // // Created by 신기열 on 24/10/2019. // Copyright © 2019 신기열. All rights reserved. // #include <stdio.h> #include <iostream> using namespace std; int n; int num[100]; int calc[4]; // 크기는 -10억 이상 10억 이하이므로 각각 초기화해준다. 단, max가 -10억이고 min이 10억이여야 크기 비교를 해줄 때 최솟값이 minans에, // 최댓값이 maxans에 들어갈 것이다. int minans = 1000000001; int maxans = -1000000001; void DFS(int calc[4], int res, int nidx){ // 숫자의 개수가 n개 이므로 index가 n을 넘어가면 res와 크기 비교를 해주고 종료해준다. if(nidx >= n){ minans = min(minans, res); maxans = max(maxans, res); return; } int tcalc[4]; int tres = res; tcalc[0] = calc[0]; tcalc[1] = calc[1]; tcalc[2] = calc[2]; tcalc[3] = calc[3]; for(int i = 0; i < 4; i++){ // 더하기 일 때 if(i == 0){ // 더하기가 1개 이상 존재하면 if(tcalc[i] > 0){ //cout << tres << " + " << num[nidx] << " = " << tres + num[nidx] << '\n'; // 맨 마지막에 구한 결과값 + 다음 index의 값 tres = tres + num[nidx]; // 더하기 연산자를 1개 빼준다. tcalc[i]--; DFS(tcalc, tres, nidx + 1); } } else if(i == 1){ // 빼기가 1개 이상 존재하면 if(tcalc[i] > 0){ //cout << tres << " - " << num[nidx] << " = " << tres - num[nidx] << '\n'; // 맨 마지막에 구한 결과값 - 다음 index의 값 tres = tres - num[nidx]; // 빼기 연산자를 1개 빼준다. tcalc[i]--; DFS(tcalc, tres, nidx + 1); } } else if(i == 2){ // 곱하기가 1개 이상 존재하면 if(tcalc[i] > 0){ //cout << tres << " * " << num[nidx] << " = " << tres * num[nidx] << '\n'; // 맨 마지막에 구한 결과값 * 다음 index의 값 tres = tres * num[nidx]; // 곱하기 연산자를 1개 빼준다. tcalc[i]--; DFS(tcalc, tres, nidx + 1); } } else if(i == 3){ // 나누기가 1개 이상 존재하면 if(tcalc[i] > 0){ //cout << tres << " / " << num[nidx] << " = " << tres / num[nidx] << '\n'; // 맨 마지막에 구한 결과값 / 다음 index의 값. 문제에서 나누기 연산은 정수 나누기 연산이라고 정의했으므로 int형 나누기를 한다. tres = tres / num[nidx]; // 나누기 연산자를 1개 빼준다. tcalc[i]--; DFS(tcalc, tres, nidx + 1); } } // 초기화 tcalc[0] = calc[0]; tcalc[1] = calc[1]; tcalc[2] = calc[2]; tcalc[3] = calc[3]; tres = res; } } int main(){ cin >> n; for(int i = 0; i < n; i++){ cin >> num[i]; } for(int i = 0; i < 4; i++){ cin >> calc[i]; } DFS(calc, num[0], 1); cout << maxans << '\n' << minans; return 0; }
댓글
댓글 쓰기