삼성 역량 기출 문제를 모두 풀어보는 것이 이번학기 목표이다.
먼저 생각난 풀이는 트리를 구성한 후 dfs 하는 것이었다. 예를 들어 + - x 한개씩 들어왔다고 생각하고 트리를 구성해보면
+ x -
/ \ / \ / \
- x - + + x
| | | | | |
x - + - x +
이렇게 6가지 경우의 수가 나온다. 이렇게 트리를 구성하고 각 루트를 시작으로 dfs 하면 완전탐색을 할 수 있을 것이다. 그러나 트리를 구성하는것도 귀찮은 일이고 순서대로 트리를 계속 넣는 게 어려웠다.
그 다음 생각난 풀이가 순열이다. + - x 를 원소로 모든 수를 사용하는 순열을 만들어 완전탐색했다. 백트래킹을 이용한 순열의 대한 글은 아래를 참조하면 좋다.https://tigerfrom2.tistory.com/72
다만, 결과를 보면 시간이 매우 오래걸린 것을 알 수 있는데 이것은 다른 사람들의 코드와 비교해보니 다른 사람들은 벡터를 사용하지 않았고 난 벡터를 사용했기 때문이다. 로직은 같다.
![](https://blog.kakaocdn.net/dn/cb491D/btr0vdqJ5xH/ngZnK2XtL8ZF5rC3MmJNuk/img.png)
DFS를 활용한 순열
이전에 dfs를 활용한 조합을 봤습니다. 순열도 비슷한 방식으로 백트래킹을 사용합니다. 조합과 순열의 가장 큰 차이는 순서입니다. 조합은 1 2 3, 1 3 2 가 같지만 순열은 다르다고 봅니다. 때문에
tigerfrom2.tistory.com
#include<iostream>
#include<vector>
using namespace std;
vector<int> num;
vector<char> op;
vector<char> oper;
int max_ = INT_MIN;
int min_ = INT_MAX;
bool visited[11] = { false, };
int N;
void dfs(int cnt) {
if (cnt == N - 1) {
int sum = num[0];
for (int i = 0; i < N - 1; i++) {
if (oper[i] == '+')
sum += num[i + 1];
else if (oper[i] == '-')
sum -= num[i + 1];
else if (oper[i] == '*')
sum *= num[i + 1];
else if (oper[i] == '/')
sum /= num[i + 1];
}
if (max_ < sum)
max_ = sum;
if (min_ > sum)
min_ = sum;
return;
}
for (int i = 0; i < N - 1; i++) {
if (visited[i] == true)
continue;
visited[i] = true;
oper.push_back(op[i]);
dfs(cnt + 1);
oper.pop_back();
visited[i] = false;
}
}
int main() {
cin >> N;
for (int i = 0; i < N; i++) {
int tmp;
cin >> tmp;
num.push_back(tmp);
}
for (int i = 0; i < 4; i++) {
int tmp;
cin >> tmp;
if (i == 0) for (int j = 0; j < tmp; j++) op.push_back('+');
else if (i == 1) for (int j = 0; j < tmp; j++) op.push_back('-');
else if (i == 2) for (int j = 0; j < tmp; j++) op.push_back('*');
else if (i == 3) for (int j = 0; j < tmp; j++) op.push_back('/');
}
dfs(0);
cout << max_ << '\n';
cout << min_ << '\n';
}
'백준 문제 풀이' 카테고리의 다른 글
백준 1715번 카드 정렬하기 (C++) (3) | 2023.03.02 |
---|---|
백준 11279번 최대 힙(C++) (0) | 2023.02.28 |
백준 3190번 뱀 (C++) (0) | 2023.02.17 |
백준 5014번 스타트링크 (C++) (0) | 2023.02.16 |
백준 2295번 세 수의 합(C++) (0) | 2023.02.14 |