상세 컨텐츠

본문 제목

< 백준 BaekJoon : 14888번 연산자 끼워넣기 > C++

C++/Baekjoon

by J2on 2024. 1. 25. 21:47

본문

<< 문제 >>

https://www.acmicpc.net/problem/14888

 

14888번: 연산자 끼워넣기

첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, 곱

www.acmicpc.net

 

연산자들의 모든 조합을 만들고, 결과 값을 만들며 확인해보는 문제입니다.

 

 

핵심은 next_permutation()을 이용한 조합 찾기라고 생각합니다.

 

오름차순으로 정렬된 컨테이너를 모든 경우의 수를 돌려가며 내림차순으로 정렬하는 동작을 합니다. 

 

마지막으로 정렬이 되었을 때, false를 return하므로 do while 문에서 사용하기 좋습니다. 

 

 

 

풀고있는 문제들이 어렵지는 않지만, 문제를 풀며 느끼는 점은 STL만 잘 익혀도 쉽게 해결할 수 있겠다는 생각입니다.

 

전에는 어떻게든 라이브러리 도움 없이 문제를 해결해보려 노력했었는데, STL을 잘 익히는 것이 훨씬 도움이 될 것 같습니다. 

 

 

 

<< 코드 >>

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int calc(int num1, int num2, const int& opr) {
	// 0 (덧셈) , 1 (뺄셈), 2(곱셈), 3(나눗셈) 
	switch (opr)
	{
	case 0:
		return num1 + num2;
		break;
	case 1 :
		return num1 - num2;
		break;
	case 2:
		return num1 * num2;
		break;
	case 3:
		if (num1 < 0) {
			num1 *= -1;
			return (num1 / num2) * -1;
		}
		else {
			return num1 / num2;
		}
	}
}


int main() {
	int num;
	cin >> num;

	int* numList = new int[num];
	for (int i = 0; i < num; i++) {
		cin >> numList[i];
	}


	vector<int> oprVec;
	for (int i = 0; i < 4; i++) {
		int n;
		cin >> n;
		for (int k = 0; k < n; k++) {
			oprVec.push_back(i);
		}
	}

	int min = 2000000000;
	int	max = -2000000000;
	int result;
	do {
		// 전부 계산 해보기	
		result = numList[0];
		for (int i = 0; i < num-1; i++) {
			result = calc(result, numList[i+1], oprVec[i]);
		}

		if (result > max) {
			max = result;
		}

		if (result < min) {
			min = result;
		}

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


	cout << max << '\n' << min;

	delete[] numList;
}

 

<< 깃헙 >> 

https://github.com/J2on/StudyAlgorithm_Part2/tree/main/%EB%B0%B1%EC%A4%80/Silver/14888.%E2%80%85%EC%97%B0%EC%82%B0%EC%9E%90%E2%80%85%EB%81%BC%EC%9B%8C%EB%84%A3%EA%B8%B0

 

 

 

 

 

 

관련글 더보기

댓글 영역