728x90
728x90

문제

세준이는 양수와 +, -, 그리고 괄호를 가지고 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다.

그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다.

괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.

 

입력

첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 많이 연속되는 숫자는 없다. 수는 0으로 시작할 수 있다. 입력으로 주어지는 식의 길이는 50보다 작거나 같다.

 

출력

첫째 줄에 정답을 출력한다.

 

예제 입력 1

55-50+40

 

예제 출력 1

-35

 

예제 입력 2 

10+20+30+40

 

예제 출력 2

100

 

예제 입력 3

00009-00009

 

예제 출력 3

0

 

알고리즘 분류

  • 수학
  • 문자열
  • 그리디 알고리즘
  • 파싱

 

문제 출처

https://www.acmicpc.net/problem/1541

 

1541번: 잃어버린 괄호

첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다

www.acmicpc.net

 


 

문제 해결 방법

  • 입력된 식에서 특정한 위치에 괄호를 추가하여 연산 결과의 최솟값을 출력시키는 문제이다.
  • 문제 해결을 위한 알고리즘은 다음과 같다.
1. 식을 넣은 문자열(@equation@)의 첫 번째 인덱스부터 마지막 인덱스까지 순회하면서, 숫자들을 벡터(@result@)에 넣는다. 단, @-@ 기호를 만날 경우, 그 뒤의 숫자들을 전부 음수로 바꿔준 후 벡터(@result@)에 넣어 준다.
2. 숫자들을 넣은 벡터의 총합(@sum@)을 구한 후, 출력시켜준다.
  • 이 알고리즘을 코드로 작성해보면 다음과 같다.
int Solution(string eq) {
    int n;
    long long sum;
    bool isMinus;
    string num;
    vector<int> result;

    sum = 0;
    isMinus = false;
    for (int i = 0; i <= eq.size(); i++) {
        if (('0' <= eq[i]) && (eq[i] <= '9')) {
            num += eq[i];
        }
        else {
            n = (isMinus == true) ? (stoi(num) * -1) : stoi(num);    // 접근한 값이 -이면, isMinus의 값에 따라 결과 벡터에 넣을 값을 변화시켜 준다.
            if (eq[i] == '-') {
                isMinus = true;       
            }
            result.push_back(n);
            num.erase();
        }
    }

    for (auto i : result) {
        sum += i;
    }

    return sum;
}

 

예제를 통해 알고리즘 이해하기

  • @예제 입력 1@을 통해 문제를 이해해보면 다음과 같다.
55-50+40
인덱스 0 1 2 3 4 5 6 7 8
  5 5 - (5 0 + 4 0) \0 
  • @-@ 뒤의 식에 괄호를 추가하면, 다음과 같은 연산을 할 수 있게 된다. 그 결과, 최솟값인 @-35@를 출력할 수 있다.
55-(50+40)

 

코드

#include <iostream>
#include <vector>
#include <string>
using namespace std;

string equation;

void Input() {
    cin >> equation;
}

int Solution(string eq) {
    int n;
    long long sum;
    bool isMinus;
    string num;
    vector<int> result;

    sum = 0;
    isMinus = false;
    for (int i = 0; i <= eq.size(); i++) {
        if (('0' <= eq[i]) && (eq[i] <= '9')) {
            num += eq[i];
        }
        else {
            n = (isMinus == true) ? (stoi(num) * -1) : stoi(num);    // 접근한 값이 -이면, isMinus의 값에 따라 결과 벡터에 넣을 값을 변화시켜 준다.
            if (eq[i] == '-') {
                isMinus = true;       
            }
            result.push_back(n);
            num.erase();
        }
    }

    for (auto i : result) {
        sum += i;
    }

    return sum;
}

void Output() {
    cout << Solution(equation) << '\n';
}

void Solve() {
    Input();
    Output();
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    Solve();

    return 0;
}

 

채점 결과

 

참고

  • [단계별로 풀어보기] > [그리디 알고리즘]
  • 실버II
728x90
728x90

'Problem Solving > BOJ' 카테고리의 다른 글

[BOJ-11718][C++] 그대로 출력하기  (0) 2023.02.23
[BOJ-10811][C++] 바구니 뒤집기  (0) 2023.02.23
[BOJ-10813][C++] 공 바꾸기  (0) 2023.02.23
[BOJ-10810][C++] 공 넣기  (0) 2023.02.23
[BOJ-11399][C++] ATM  (0) 2023.02.09
[BOJ-1931][C++] 회의실 배정  (0) 2023.02.06
[BOJ-11047][C++] 동전 0  (2) 2023.02.06
[BOJ-2751][C++] 수 정렬하기 2  (0) 2023.02.04