문제 URL : https://programmers.co.kr/learn/courses/30/lessons/67257
문제 접근법 :
연산자인 *+- 를 정렬합니다. 정렬하는 이유는 어떤것이 아스키코드가 앞서인지 모르기때문에 아시는분은
아스키코드가 앞서있는것부터 배치하시면됩니다.
연산순서에 나올수있는 모든 6가지 경우의수를 구하기위해 next_permutaion을 이용하는것을 기본일겁니다.
그렇다면 문자열인 s에 숫자와 연산자를 고루고루 뺍니다.
숫자는 반드시 연산자의 개수+1 개가 나와야 하고
이문제는 list를 이용하는것이 가장 빠르겠지만 문자열의 길이가 짧아서 vector을 이용해도 문제없습니다.
모든 연산을 순서대로 진행해서 절대값의 가장 큰것만 저장해주면 되는문제입니다.
소스코드 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll cal(ll a, ll b,char p) {
if (p == '+')return a + b;
else if (p == '-')return a - b;
return a * b;
}
long long solution(string expression) {
long long answer = 0;
string temp;
string comb = "*+-";
vector<ll> v;
string op;
sort(comb.begin(), comb.end());
for (char c : expression) {
if ('0' <= c && c <= '9')
temp += c;
else
{
v.push_back(stoi(temp));
op += c;
temp = "";
}
}
v.push_back(stoi(temp));
do {
string ops = op;
vector<ll> v2 = v;
for (char opr : comb) {
for (int i = 0; i < ops.size(); i++) {
if (opr == ops[i]) {
ll num = cal(v2[i], v2[i + 1], opr);
v2.erase(v2.begin() + i);
v2.erase(v2.begin() + i);
v2.insert(v2.begin() + i, num);
ops.erase(ops.begin() + i);
i--;
}
}
}
answer = max(answer, abs(v2[0]));
} while (next_permutation(comb.begin(), comb.end()));
return answer;
}
|
cs |
궁금한점 혹은 모르는점 어떤질문이든 댓글은 언제나 환영입니다.
'프로그래머스' 카테고리의 다른 글
프로그래머스 [3차]파일명 정렬(2018 KAKAO BLIND RECRUITMENT) (0) | 2021.08.19 |
---|---|
프로그래머스 퍼즐 조각 채우기(위클리 챌린지 3주차) (0) | 2021.08.18 |
프로그래머스 문자열 압축(2020 KAKAO BLIND RECRUITMENT) (0) | 2021.08.01 |
프로그래머스 메뉴 리뉴얼 (2021 KAKAO BLIND RECRUITMENT) (0) | 2021.08.01 |
프로그래머스 괄호 변환 (2020 KAKAO BLIND RECRUITMENT) (0) | 2021.07.31 |