본문 바로가기

알고리즘/프로그래머스

[Lev.2] 수식 최대화(C++)

1. 문제 

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

 

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

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

programmers.co.kr

 

2. 접근 방법

1) 우선 "숫자"와 "연산자"를 나누어 준다. 

2) 연산자 별 우선순위 경우의 수를 next_permutation으로 만들어서 각 경우의 수 별로 연산을 수행한다.

3) 우선순위에 해당하는 연산자를 발견하면, 연산자 기준 양 옆의 숫자를 연산하여 연산 결과를 다시 list에 넣는다.

 

-> 중간에 삽입/삭제가 자주 있으므로 list를 사용해야 한다.

 

3. 실수했던 부분 & 처음 알았던 부분

1) iterator 접근 방법

    - iterator는 +연산,- 연산을 지원하지 않는다!!!!(iterator +=2 같은 게 안된다는 의미)

    => iter = next(iter, 2) ; 혹은 advence(iter,2); 를 사용하자.

    => iter = prev(iter,2);

 

2) containter 별 장단점

 

*  시퀀스 컨테이너 

 - 예 : 

 - 특징 :

 - 장점:

 - 단점 

 

 

3) string을 연산자와 숫자로 나누는 법 (다른 고민 생각하지 말고 바로 이 방식 사용하기)

    //수식을 숫자와 연산자로 나누어서 리스트에 저장
    int idx = 0;
    for (int i=0;i<expression.length();i++) {
        if(expression[i] < '0' || expression[i] > '9') {
            li.push_back(expression.substr(idx,i-idx)); //idx부터 (i-idx)개수만큼 숫자로 저장
            li.push_back(string(1,expression[i])); // 연산자 부분 자르기
            idx = i+1;
        }
    } 
    //마지막 부분까지 처리 해야 한다.
    li.push_back(expression.substr(idx));

 

4. 코드

더보기
#include <string>
#include <list>
#include <algorithm>
using namespace std;

string cal(string num1, string op, string num2) {
    long long ret = 0;
    if(op == "*") ret = stol(num1) * stol(num2);
    else if (op == "+") ret = stol(num1) + stol(num2);
    else ret = stol(num1) - stol(num2);
    return to_string(ret);   
}

long long getNum(list <string> li, string *prior) {
    for (int i =0; i <3; i++) {
        string op = prior[i];
        for(list<string>::iterator iter = li.begin(); iter!= li.end();) {
         //현재 우선순위의 연산자 찾으면 연산자 기준 양 옆의 수로 계산
         if(*iter== op) {
             string newNum = cal(*prev(iter,1),op,*next(iter,1)); //계산한 값
             iter = li.erase(prev(iter,1),next(iter,2)); //피연산자 2개,연산자 제거
             li.insert(iter,newNum); // 계산한 값 삽입
         }   
        else iter++;    
        }
    }
    return abs(stol(li.front()));
}

long long solution(string expression) {
    long long answer = 0;
    string prior[3] = { "*","+","-"};
    list< string > li;
    int idx = 0;
    //수식을 숫자와 연산자로 나누어서 리스트에 저장
    for (int i=0;i<expression.length();i++) {
        if(expression[i] < '0' || expression[i] > '9') {
            li.push_back(expression.substr(idx,i-idx));
            li.push_back(string(1,expression[i]));
            idx = i+1;
        }
    } 
    li.push_back(expression.substr(idx));
    
    //경우의 수만큼 함수 호출
    do {
        answer = max(answer,getNum(li,prior));
    }while(next_permutation(prior,prior+3));
    
    return answer;
}

'알고리즘 > 프로그래머스' 카테고리의 다른 글

[Lv2]구명보트(C++)  (0) 2020.10.17
[Lv2]삼각달팽이(C++)  (0) 2020.10.17
[Lev.3] 경주로 건설  (0) 2020.07.03
[Lev.3] 자물쇠와 열쇠(C++)  (0) 2020.07.01
N으로 표현(DP) / C++  (1) 2020.06.29