Algorithm/백준

[백준][C++] 1541번: 잃어버린 괄호 <235>

샤아이인 2022. 7. 18.

직접 풀어보고 올리는 코드입니다. 지적이나 더 좋은 방향에 대한 댓글은 항상 환영합니다.

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

 

1541번: 잃어버린 괄호

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

www.acmicpc.net

 

생각의 흐름

일단 생각보다 잘 안풀렸던 문제... 문자열 파싱이야 쉬운데... 최소의 값을 어떤 방식으로 만들것인가?

 

이걸 생각 못해서... 다른 블로그의 글을 참고하였다.

 

생각보다 간단하다, - (음수) 부호 뒤의 모든 수를 뺴주면 된다.

예를 들어 다음과 같은 예시가 있다고 해보자.

 

20-190+10+2-55

위 수식을 최소로 만들기 위한 괄호를 배치하면 다음과 같다.

20-(190+10+2)-55

 

즉, - 부호 뒤의 모든 수를 뺴주면 된다.

 

또한 코드에서 다음과 같이 한번에 if에서 확인하는 이유가 있다.

if (str[i] == '+' || str[i] == '-' || i == len)

 

원래 나같은 경우 전체 구조를 다음과 같이 생각했었다.

if (str[i] == '-') {
  // ...
} else if (str[i] == '+' || i == len) {
  // ...
} else {
    num *= 10;
    num += str[i] - '0';
}

하지만 - 나 +인 둘다 공통적으로 맨 처음 수는 res 변수에 그냥 담아줘야 하는 공통적인 과정이 있다.

또한 i == len 의 상황, 즉 문자열의 끝에 도달했을때도 공통적으로 처리하는 과정이 있다.

따라서 if에서 한번에 확인을 하게 되었다.

 

나의 코드

#include <bits/stdc++.h>
#include <iostream>

using namespace std;
#define MAX 55

int res;

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    string str;
    cin >> str;

    int len = str.length();

    bool isMinus = false;
    int num = 0;
    for (int i = 0; i <= len; i++) {
        if (str[i] == '+' || str[i] == '-' || i == len) {
            if (isMinus){
                res -= num;
            } else {
                res += num;
            }
            num = 0;

            if (str[i] == '-') isMinus = true;
        } else {
            num *= 10;
            num += str[i] - '0';
        }
    }

    cout << res;

    return 0;
}

댓글