boj_14888_연산자끼워넣기

pdot715·2018년 10월 24일
1

삽질 포인트

  • 최대 최소 범위!
    • int는 -0x3f3f3f3f ~ 0x3f3f3f3f로 하면 편하다

정답 코드

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int T, N;
vector <int> num;
vector <int> symbol;
int PL, MI, DI, MU;

int main() {


		int tmp;
		scanf("%d", &N);
		for (int i = 0; i < N; i++) {
			scanf("%d", &tmp);
			num.push_back(tmp);
		}

		scanf("%d %d %d %d", &PL, &MI, &MU, &DI);
	

		int max_sum = -0x3f3f3f3f;
		int min_sum = 0x3f3f3f3f;


		for (int i = 0; i < PL; i++) {
			symbol.push_back(1);
		}

		for (int i = 0; i < MI; i++) {
			symbol.push_back(2);
		}

		for (int i = 0; i < MU; i++) {
			symbol.push_back(3);
		}

		for (int i = 0; i < DI; i++) {
			symbol.push_back(4);
		}

		sort(symbol.begin(), symbol.end());

// 각각의 위치에 대해서
// 1, 1, 2, 2, 3, 3, 4, 4
// 1, 1, 2, 2, 3, 4, 4, 3
// .... 이런 식으로 모든 순열이 나옴
// 연산자의 위치가 달라지므로 값의 결과도 달라지게 됨

		do {
			int sum = num[0];

			for (int i = 0; i < symbol.size(); i++) {
				if (symbol[i] == 1) {
					sum += num[i + 1];
				}
				else if (symbol[i] == 2) {
					sum -= num[i + 1];
				}
				else if (symbol[i] == 3) {
					sum *= num[i + 1];
				}
				else if (symbol[i] == 4) {
					sum /= num[i + 1];
				}
			}


			if (sum >= max_sum) {
				max_sum = sum;
			}

			if (sum <= min_sum) {
				min_sum = sum;
			}

			/*
			for (int i = 0; i < symbol.size(); i++) {
				printf("%d ", symbol[i]);
			}
			printf("\n");
			*/


		} while (next_permutation(symbol.begin(), symbol.end()));

		num.clear();
		symbol.clear();

		printf("%d\n", max_sum);
		printf("%d", min_sum);



}
profile
개발자지망

0개의 댓글