Skip to content

Conversation

@Seol-Munhyeok
Copy link
Collaborator

@Seol-Munhyeok Seol-Munhyeok commented Sep 3, 2025

πŸ”— 문제 링크

μˆ˜μ‹ μ΅œλŒ€ν™”
https://school.programmers.co.kr/learn/courses/30/lessons/67257

βœ”οΈ μ†Œμš”λœ μ‹œκ°„

35λΆ„

✨ μˆ˜λ„ μ½”λ“œ

μ—°μ‚°μž 별 μš°μ„  μˆœμœ„λ₯Ό permutationsλ₯Ό ν†΅ν•΄μ„œ λͺ¨λ“  μˆœμ—΄μ„ κ΅¬ν•˜κ³  κ·Έ μˆœμ„œμ— λ”°λΌμ„œ μ‹€μ œλ‘œ 계산을 μˆ˜ν–‰ν•΄μ„œ μ΅œλŒ€κ°’μ„ 찾으면 λ˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

λ¬Έμžμ—΄λ‘œ 된 μˆ˜μ‹μ„ μ–΄λ–»κ²Œ κ³„μ‚°ν• μ§€λŠ” λ‹€μ–‘ν•œ 방법이 μžˆμ„ κ±° 같은데 μ €λŠ” μŠ€νƒμ„ μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€.
μˆ˜λ„μ½”λ“œλ‘œ λ‚˜νƒ€λ‚΄λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

ν”Όμ—°μ‚°μžμ™€ μ—°μ‚°μžλ₯Ό λ”°λ‘œ λΆ„λ¦¬ν•΄μ„œ token 배열에 λ‹΄λŠ”λ‹€.
μ—°μ‚°μž μ’…λ₯˜(+ - *)의 λͺ¨λ“  μˆœμ—΄μ— λŒ€ν•΄:
    ν˜„μž¬ μ²˜λ¦¬ν•  μ—°μ‚°μžλ₯Ό μ •ν•œλ‹€:
        토큰 리슀트λ₯Ό μ™Όμͺ½λΆ€ν„° μŠ€μΊ”ν•˜λ©΄μ„œ:
            λ§Œμ•½ ν˜„μž¬ 토큰이 β€œμ§€κΈˆ μ²˜λ¦¬ν•  μ—°μ‚°μžβ€λΌλ©΄:
                stackμ—μ„œ 맨 μœ„ ν”Όμ—°μ‚°μž κΊΌλ‚΄κ³ , λ‹€μŒ μˆ«μžλž‘ κ³„μ‚°ν•΄μ„œ κ²°κ³Όλ₯Ό λ‹€μ‹œ push.
            κ·Έ μ™Έ μ—°μ‚°μžμ΄κ±°λ‚˜, ν”Όμ—°μ‚°μž(숫자)라면:
                κ·Έλƒ₯ stack에 push.

πŸ“š μƒˆλ‘­κ²Œ μ•Œκ²Œλœ λ‚΄μš©

νŒŒμ΄μ¬μ€ eval() μ΄λΌλŠ” λ¬Έμžμ—΄λ‘œ 된 μˆ˜μ‹μ„ λ°”λ‘œ 계산할 수 μžˆλŠ” ν•¨μˆ˜κ°€ μžˆμ–΄μ„œ 직접 μš°μ„ μˆœμœ„μ— 맞좰 κ΄„ν˜Έλ₯Ό μ£Όμž…ν•˜κ³  eval()둜 κ³„μ‚°ν•˜λŠ” 날먹이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

def solution(expression):
    operations = [('+', '-', '*'),('+', '*', '-'),('-', '+', '*'),('-', '*', '+'),('*', '+', '-'),('*', '-', '+')]
    answer = []
    for op in operations:
        a = op[0]
        b = op[1]
        temp_list = []
        for e in expression.split(a):
            temp = [f"({i})" for i in e.split(b)]
            temp_list.append(f'({b.join(temp)})')
        answer.append(abs(eval(a.join(temp_list))))
    return max(answer)

그런데 λ„μ €νžˆ μ‹€μ „μ—μ„œλŠ” λͺ» λ– μ˜¬λ¦΄ ν’€μ΄κ°™μŠ΅λ‹ˆλ‹€... 일단 eval() μ΄λΌλŠ” ν•¨μˆ˜κ°€ μžˆλ‹€λŠ” κ²ƒλ§Œ κΈ°μ–΅ν•˜λ©΄ 쒋을 κ±° κ°™μŠ΅λ‹ˆλ‹€.

참고둜 μ‹€λ¬΄μ—μ„œλŠ” eval() ν•¨μˆ˜λŠ” λ³΄μ•ˆ 문제둜 μ“°μ§€ μ•ŠλŠ”λ‹€κ³  ν•©λ‹ˆλ‹€.

@hyeokbini
Copy link
Collaborator

간단해 λ³΄μ΄λŠ”λ° 손이 κ½€λ‚˜ κ°€λŠ” λ¬Έμ œμ˜€λ„€μš”... 저도 ν’€μ΄ν•˜λŠ” 큰 κ³¨μžλŠ” λ¬Έν˜λ‹˜κ³Ό λΉ„μŠ·ν–ˆμŠ΅λ‹ˆλ‹€. μ—°μ‚°μž μš°μ„ μˆœμœ„λ₯Ό κ°„λ‹¨νžˆ μž¬κ·€ν•¨μˆ˜λ‘œ 뽑아 μ€€ λ‹€μŒ, ν•΄λ‹Ή μš°μ„ μˆœμœ„μ— λŒ€ν•΄ κ³„μ‚°λœ 값을 μ΄μš©ν•΄ answerλ₯Ό κ°±μ‹ ν•΄λ‚˜κ°€λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

λ‹€λ§Œ μŠ€νƒμ„ μ‚¬μš©ν•΄μ„œ μ‹€μ œ 연산을 ν•˜λŠ” λΆ€λΆ„μ—μ„œ μ•½κ°„ λΉ„νš¨μœ¨μ μΈ λΆ€λΆ„μ΄μ—ˆλ‚˜..? 싢은 뢀뢄이 ν•œ μ—°μ‚°μžμ— λŒ€ν•΄ 연산을 끝낸 ν›„, μž„μ‹œ 벑터λ₯Ό μ΄μš©ν•΄ λ‹€μŒ μ—°μ‚°μžλ₯Ό μœ„ν•œ μ„ΈνŒ…μ„ ν•΄μ£ΌλŠ” 뢀뢄이 μžˆλŠ”λ° μƒκ°ν•œ κ±Έ μ „λΆ€ κ΅¬ν˜„ν•΄λ³΄λ‹ˆ reverseλž‘ while(!empty)κ°€ λ„ˆλ¬΄ 많이 μ‚¬μš©λ˜λ”λΌκ΅¬μš”. μ‹œκ°„ 초과λ₯Ό κ°μˆ˜ν•˜κ³  μ œμΆœν–ˆλŠ”λ°, 일단 정닡을 λ°›κΈ΄ ν–ˆμŠ΅λ‹ˆλ‹€. λ‚˜μ€‘μ— 더 μ΅œμ ν™”ν•  수 μžˆλŠ” 뢀뢄이 μžˆλŠ”μ§€, κΉ”λ”ν•œ 둜직이 μžˆλŠ”μ§€ 고민해봐야할 것 κ°™μŠ΅λ‹ˆλ‹€.

또 ν•˜λ‚˜ λŠλ‚€ 점은 next_permutation에 λŒ€ν•΄μ„œ 각 작고 κ³΅λΆ€ν•˜λŠ” μ‹œκ°„μ„ 가져봐야겠닀고 λŠκΌˆμŠ΅λ‹ˆλ‹€. μ½”λ”©ν…ŒμŠ€νŠΈμ—μ„œ μˆœμ—΄ / μ‘°ν•©λ‘  λ¬Έμ œκ°€ κ½€λ‚˜ 자주 λ“±μž₯ν•˜λŠ” 것 같은데, κ·Έλ•Œλ§ˆλ‹€ μž¬κ·€λ‘œ 짜긴 ν•˜μ§€λ§Œ μ—¬κ°„ 번거둜운 게 μ•„λ‹ˆλ”λΌκ΅¬μš”. 큰 ν‹€ 4κ°€μ§€(μ‘°ν•© / μˆœμ—΄ / 쀑볡쑰합 / μ€‘λ³΅μˆœμ—΄)에 λŒ€ν•΄μ„œλ§Œμ΄λΌλ„ ν•¨μˆ˜λ‘œ μ§œλŠ” 법을 미리 μ—°μŠ΅ν•΄ λ‘¬μ•Όκ² μŠ΅λ‹ˆλ‹€.

제좜 μ½”λ“œμž…λ‹ˆλ‹€. κ³ μƒν•˜μ…¨μ–΄μš”!

μˆ˜μ‹ μ΅œλŒ€ν™” / c++
#include <bits/stdc++.h>

using namespace std;

long long calc(long long a, long long b, char op)
{
    if (op == '+') return a + b;
    if (op == '-') return a - b;
    return a * b;
}

// 계산
long long evaluate(vector<long long> nums, vector<char> ops, vector<char> priority)
{
    for (char p : priority)
    {
        stack<long long> stnum;
        stack<char> stop;

        stnum.push(nums[0]);

        for (int i = 0; i < ops.size(); i++)
        {
            if (ops[i] == p)
            {
                long long a = stnum.top();
                stnum.pop();

                long long b = nums[i + 1];
                stnum.push(calc(a, b, ops[i]));
            }
            else
            {
                stnum.push(nums[i + 1]);
                stop.push(ops[i]);
            }
        }

        // λ‹€μŒ 연산을 μœ„ν•΄ μ΄ˆκΈ°ν™”ν•˜κΈ°
        nums.clear();
        ops.clear();

        vector<long long> tempnum;
        vector<char> tempop;

        while (!stnum.empty())
        {
            tempnum.push_back(stnum.top());
            stnum.pop();
        }
        reverse(tempnum.begin(), tempnum.end());

        while (!stop.empty())
        {
            tempop.push_back(stop.top());
            stop.pop();
        }
        reverse(tempop.begin(), tempop.end());

        nums = tempnum;
        ops = tempop;
    }
    return nums[0];
}

vector<char> operators = {'+', '-', '*'};
vector<bool> used(3,false);
long long answer = 0;
vector<char> cur;

// μ—°μ‚°μž μˆœμ—΄
void permute(vector<long long>& nums, vector<char>& ops)
{
    if (cur.size() == 3)
    {
        long long res = evaluate(nums, ops, cur);
        answer = max(answer, abs(res));
        return;
    }

    for (int i = 0; i < 3; i++)
    {
        if (!used[i])
        {
            used[i] = true;
            cur.push_back(operators[i]);

            permute(nums, ops);

            cur.pop_back();
            used[i] = false;
        }
    }
}

long long solution(string expression)
{
    vector<long long> nums;
    vector<char> ops;
    string num = "";

    // 숫자/μ—°μ‚°μž 뢄리
    for (char c : expression)
    {
        if (isdigit(c))
        {
            num += c;
        }
        else
        {
            nums.push_back(stoll(num));
            num = "";
            ops.push_back(c);
        }
    }
    nums.push_back(stoll(num));

    permute(nums, ops);
    return answer;
}

@mj010504
Copy link
Collaborator

mj010504 commented Sep 8, 2025

0이 κ°€λŠ₯ν•˜λ‹€λŠ” 것과 long long νƒ€μž…μΈ 것을 λ†“μ³μ„œ μ‚½μ§ˆμ„ μ˜€λž˜ν–ˆλ„€μš”. intλ‘œλŠ” λΆ€μ‘±ν•  수 μžˆλ‹€λŠ” 것을 항상 λͺ…μ‹¬ν•΄μ•Όκ² μŠ΅λ‹ˆλ‹€.
μ „ μ²˜μŒμ— μˆ«μžμ™€ 문자 λΆ„λ¦¬ν•˜κ³  c++ next_permutation ν•¨μˆ˜λ₯Ό 톡해 μ—°μ‚°μž μˆœμ—΄μ„ λ§Œλ“€μ–΄μ„œ ν™œμš©ν–ˆμŠ΅λ‹ˆλ‹€. μŠ€νƒμ„ μ‚¬μš©ν•΄λ„ 될 것 κ°™κΈ΄ν•œλ° κ°„λ‹¨ν•΄μ„œ κ·Έλƒ₯ λ°˜λ³΅λ¬Έμ„ μ‚¬μš©ν•˜κ³  λ°°μ—΄μ—μ„œ 값을 μ œκ±°ν•΄μ£Όκ³  μƒˆλ‘œμš΄ 값을 λŒ€μž…ν•΄μ£Όμ–΄μ„œ ν’€μ΄ν–ˆμŠ΅λ‹ˆλ‹€. 쒋은 방법은 μ•„λ‹Œ 것 κ°™μŠ΅λ‹ˆλ‹€.
μˆ˜κ³ ν•˜μ…¨μŠ΅λ‹ˆλ‹€!!

μˆ˜μ‹ μ΅œλŒ€ν™”
#include<bits/stdc++.h>

using namespace std;

long long calc(long long a, long long b, char c) {
    if(c == '*') return a * b;
    if(c == '+') return a + b;
    if(c == '-') return a - b;
}

long long solution(string str) {
    long long res = 0;
    vector<long long> nv; // 숫자
    vector<char> cv;
    set<char> cs; // μ—°μ‚° 기호 μ§‘ν•©

     long long num = 0;
    for(int i = 0; i < str.size(); i++) {
        if(str[i] >= '0' && str[i] <= '9') {
             if(num == 0 && str[i] == '0') {
                 nv.push_back(0);
                 continue;
             }
            else num = num * 10 + (str[i] - '0');
        }
        else {
            if(num > 0) {
                nv.push_back(num);
                num = 0;
            }

            if(str[i] == '*' || str[i] == '-' || str[i] == '+') {
                cs.insert(str[i]);
                cv.push_back(str[i]);
            }
        }
    }

    nv.push_back(num);

    vector<char> tv;
    for(auto c : cs) {
        tv.push_back(c);
    }


   do {
    auto tnv = nv;
    auto tcv = cv;

    for(int i = 0; i < tv.size(); i++) {
        char c = tv[i];
        int f = tcv.size();
        for(int j = 0; j < f; j++) {
            if(tcv[j] == c) {
                long long tn = calc(tnv[j], tnv[j + 1], c);
                tnv[j] = tn;
                tnv.erase(tnv.begin() + j + 1);
                tcv.erase(tcv.begin() + j);
                f--;
                j--;
            }
        }
        
     
    }
   
    
    res = max(res, abs(tnv[0]));

   
   } while(next_permutation(tv.begin(), tv.end()));    // μ—°μ‚°μž μš°μ„ μˆœμœ„ μ •ν•˜κΈ°

 
    return res;
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants