본문 바로가기
프로그래머스

프로그래머스 수식 최대화 (2020 카카오 인턴십)

by 콩순이냉장고 2021. 8. 2.

문제 URL : https://programmers.co.kr/learn/courses/30/lessons/67257

 

코딩테스트 연습 - 수식 최대화

IT 벤처 회사를 운영하고 있는 라이언은 매년 사내 해커톤 대회를 개최하여 우승자에게 상금을 지급하고 있습니다. 이번 대회에서는 우승자에게 지급되는 상금을 이전 대회와는 다르게 다음과

programmers.co.kr

 

문제 접근법 : 

연산자인 *+- 를 정렬합니다. 정렬하는 이유는 어떤것이 아스키코드가 앞서인지 모르기때문에 아시는분은 

아스키코드가 앞서있는것부터 배치하시면됩니다.

연산순서에 나올수있는 모든 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

 

궁금한점 혹은 모르는점 어떤질문이든 댓글은 언제나 환영입니다.