<< 문제 >>
https://www.acmicpc.net/problem/14888
연산자들의 모든 조합을 만들고, 결과 값을 만들며 확인해보는 문제입니다.
핵심은 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;
}
<< 깃헙 >>
< 백준 BaekJoon : 9184번 신나는 함수 실행> C++ (0) | 2024.01.27 |
---|---|
< 백준 BaekJoon : 14889번 스타트와 링크 > C++ (0) | 2024.01.26 |
< 백준 BaekJoon : 20920번 영단어 암기는 괴로워 > C++ (0) | 2024.01.24 |
< 백준 BaekJoon : 26069번 붙임성 좋은 총총이 > C++ (0) | 2024.01.24 |
< 백준 BaekJoon : 1037번 약수 > C++ (0) | 2024.01.24 |
댓글 영역