www.acmicpc.net/problem/1541

 

1541번: 잃어버린 괄호

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

www.acmicpc.net

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

int main(void)
{
    string s;
    cin >> s;
    vector<int> plus;    // 더하기 될 숫자들의 모음
    vector<int> minus;   // 빼기 될 숫자들의 모음
    int temp = 0, target = s.size();    // target 은 처음으로 마이너스가 나오는 자리
    for(int i = 0 ; i < s.size() ; i++)
    {
        if(s[i] == '-')
        {
            target = i;                 // target 위치를 구해놓고
            break;
        }
    }
    for(int i = 0 ; i < target ; i++)   // 처음으로 - 가 나오기 전까지는 다 plus 에 넣어준다
    {                                   // 플러스와 마이너스 사이에 인덱스 조절 신경써줘야 한다
        if(s[i] == '+' || s[i] == '-')
        {
            plus.push_back(temp);
            temp = 0;
        }
        else
        {
            temp = temp * 10 + int(s[i] - '0');
        }
    }
    plus.push_back(temp);
    temp = 0;
    for(int i = target + 1 ; i < s.size() ; i++)        // 그 이후의 숫자들부터는 minus 에 넣음
    {
        if(s[i] == '+' || s[i] == '-')
        {
            minus.push_back(temp);
            temp = 0;
        }
        else
        {
            temp = temp * 10 + int(s[i] - '0');
        }
    }
    if(target != s.size()) minus.push_back(temp);       // 만약 - 가 하나도 나오지 않았을 경우는 플러스들만 더해줌
    int ans = 0;
    for(int i = 0 ; i < plus.size() ; i++) 
    {
        ans += plus[i];                                 // 플러스 친구들은 더해주고
    }
    for(int i = 0 ; i < minus.size() ; i++)             // 마이너스 친구들은 빼주면 답이 나옴!
    {
        ans -= minus[i];
    }
    cout << ans << '\n';
}

 

[Approach]

1. 첫번째 수를 제외하고 나머지 수들은 괄호를 사용하면 전부 (-) 처리 할 수 있다.

2. 첫 번째 마이너스가 나오기 전까지의 수들은 반드시 플러스여야 한다는 걸 생각지 못했다

3. 마이너스가 아예 나오지 않을 경우에 대한 예외처리도 필요할 듯

 

[Point]

1. 디테일 부분들을 챙겨줘야 했는데 그러지 못했고, 코드 역시 예외처리해주느라 상당히 많이 지저분해진 것 같다.

2. scanf 로 %d%c 와 같이 받으면(혹은 %d 로 부호까지 한번에) 굳이 문자열로 받아서 잘라줄 필요가 없었다.

3. cin 도 형식을 지정해놓고 입력시키면 공백이 없더라도 그에 맞춰서 받아오는 것 같다.

 

[More]

1. cin  /  cin.get()  /  cin.getline()

'PS > BOJ' 카테고리의 다른 글

[백준] 5430.cpp : AC  (0) 2020.07.03
[백준] 1780.cpp : 종이의 개수  (0) 2020.07.03
[백준] 1260.cpp : DFS 와 BFS  (0) 2020.07.02
[백준] 1012.cpp : 유기농 배추  (0) 2020.07.02
[백준] 11399.cpp : ATM  (0) 2020.07.02

+ Recent posts