🖥️ CS/Baekjoon Algorithms

#1541 잃어버린 괄호 (C++)

한국의 메타몽 2020. 10. 6. 21:25

링크 : www.acmicpc.net/problem/1541

 

1541번: 잃어버린 괄호

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

www.acmicpc.net

이 문제는 해석을 잘 해야한다. 

 

조건을 요약하면 다음과 같다. 

 

  1. 숫자는 0으로 시작될 수 있다. 즉, 06600을 6600으로 인식해서 받아들여야한다.
  2. +와 -로만 구성되어있다. 
  3. 두 개 이상의 연산자가 나타나지 않는다. 이말은 --, -+ 이러한 연산자가 등장하지 않는다는 뜻이 아니라
    -연산자가 등장하면 그 다음 연산에는 +연산자가 등장한다는 의미이다.
  4. 괄호는 1개만 쓰이는게 아니다. 여러 곳에 괄호가 등장할 수 있다.
  5. 연산자는 0개일 수 있다. 즉, 06600 숫자만 주어지고 끝날수도 있다. 

 

문제가 짧다보니 너무 방심한 탓에 규칙을 제대로 파악하지 못했다.

특히 4번을 잘못 이해한 탓에 코드를 제대로 잘못 작성했고, 테스트 케이스는 통과했으나 문제는 맞지 못하는 실수를 저질렀다. 

 

 

문제풀이는 다음과 같다. 

 

  1. 문자열을 하나의 변수로 입력받는다. 
  2. 마이너스가 등장하는 조건을 세운다. 한 번 마이너스가 등장하면 그 뒤로 두 개의 숫자는 무조건 제외하면 된다. 
  3. 맨 마지막은 숫자만 입력되므로, 해당 숫자도 연산을 진행해야한다.
    따라서 문자열의 범위를 size()이하까지 받아들인 뒤 조건에 '\0'인 경우도 포함시킨다.
    (즉, 공백을 만나 문자열이 종료되는 시점까지 고려해야한다.)
#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
using namespace std;
int mini = INT_MAX;
string s = "";
string temp = "";
int minu = 0;
int res = 0;

void calculate(){
    for(int i=0; i<=s.size(); i++){
        if(s[i]=='+'||s[i]=='-'||s[i]=='\0'){ //숫자만 나오고 끝나는 경우도 고려
            if(minu) res -= stoi(temp);
            else res += stoi(temp);
            if(s[i]=='-') minu = 1;
            temp = "";
            continue;
        }
        temp += s[i];
    }
}

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

    cin >> s;
    calculate();
    cout << res;
    return 0;
}

생각해보면 맨 처음의 연산이 +이냐, -이냐만 따져서 그 뒤로는 모조리 값을 빼주면 되는 간단한 문제다.

다만 문제 해석을 제대로 하지 못한탓에, 풀이 시간은 2시간 가까이가 소요되었다. 

'🖥️ CS > Baekjoon Algorithms' 카테고리의 다른 글

#10844번 쉬운 계단 수 (C++)  (0) 2020.10.15
#7569 토마토 (C++) 🍅  (0) 2020.10.07
#7562 나이트의 이동 (C++)  (0) 2020.10.02
#6603 로또 (C++)  (0) 2020.10.02
#2206 벽 부수고 이동하기 (C++)  (0) 2020.10.02