[c/c++] 백준 1541 (Silver 2)

은동·2023년 2월 12일
0

Baekjoon

목록 보기
28/49

🔨 문제

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

<요약>
괄호가 없는 식이 주어졌을 때 괄호를 적절히 사용하여 최소값을 만드는 것

ex. 55-50+40 -> 55-(50+40) = -35


🔨 해결방법

우선 나는 처음에 알고리즘을 어떻게 구현해야 할지부터 막막했다. 하지만 정답률이 50%가 넘어서 더 멘붕 ㅠ.ㅠ

방법은 의외로 간단했다. '-'마이너스 기호가 한 번이라도 나오면 뒤에 '+'기호가 나왔을 때 다 '-'로 계산해버리면 된다.

내가 막혔던 부분은

  1. 처음의 값을 어떻게 저장하지?
    -> false로 초기화 한 bool형의 isMinus변수를 사용하여 연산 기호가 나온다면 isMinus를 true로 변경하고, 연산 기호가 나오기 전의 숫자(string형)는 연산 기호가 +든지 -든지 최종 결과에 stoi하여 더해준다.

  2. 그렇다면 마지막 숫자는 어떻게 하지?
    -> 나는 처음에 for문을 (int i=0;i<str.size();i++)이라고 선언했었는데, 이렇게 되면 숫자인 문자로만 처리를 하고 끝나버린다.
    그래서 for문의 범위를 늘려줘서 i가 str.size()와 같아지면 isMinus의 상태에 따라 더하든가 빼든가 해준다.


🔨 코드

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

int main() {

    cin.tie(NULL);
    cout.tie(NULL);
    ios::sync_with_stdio(false);

    string str;
    cin >> str;
    string buffer;  // stoi하기 전의 string형 숫자를 저장
    bool isMinus=false;	// 마이너스 연산기호가 나왔는지 확인용
    int result = 0;	// 최종 결과 출력용

    for (int i = 0; i <= str.size(); i++) {	//마지막은 숫자로 끝난다는 조건이 있기 때문에- 
    //-연산에 포함시키기 위해서 i<=str.size()라고 범위를 설정했다.
        if ('0' <= str[i] && str[i] <= '9') { 
            buffer += str[i];  // 숫자라면 하나씩 추가 -> 한꺼번에 stoi 사용
        }
        else if (str[i] == '-' || str[i] == '+'|| i == str.size()) {
            if (isMinus) {	// 마이너스가 한 번이라도 나왔다면
                result -= stoi(buffer);
                buffer = "";
            }
            else {
                result += stoi(buffer);
                buffer = "";
            }
        }
        if (str[i] == '-') isMinus = true;
       
        
    }
    cout << result;

    return 0;
}
profile
자자 선수입장~

0개의 댓글