T'SPACE

다채로운 에디터들의 이야기

컴퓨터공학/알고리즘

[백준/C++] 1541: 잃어버린 괄호

Tonny Kang 2024. 2. 27. 08:06
반응형

728x90

문제

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

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

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

반응형

입력

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

출력

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

예제 입력 1 복사

55-50+40

예제 출력 1 복사

-35

예제 입력 2 복사

10+20+30+40

예제 출력 2 복사

100

예제 입력 3 복사

00009-00009

예제 출력 3 복사

0
 
처음에는 - 후에 있는 숫자들을 괄호로 묶어서 계산 하는 방법을 생각했다
50+39-19+349+34-23 이면
50+39-(19+349+34)-23 이렇게 할 생각이였다
 
그러나 ㅋㅋㅋㅋㅋㅋ 더 쉬운 방법이 있었다
그냥 -가 한번 등장하면 뒤에 오는 +들을 -로  바꿔주면 된다
 
#include <iostream>
#include <vector>
#include <map>
#include <stack>
#include <string>
#include <sstream>
#include <algorithm>
#include <utility>
#include <math.h>
#include <queue>
using namespace std;



int main() {
	string expression;
	cin >> expression;
	queue <char> signs;

	int change = 0;
	string num = "";
	char lastSign='+';
	int minAnswer = 0;

	for (char& c : expression) {
		if (c == '+' || c == '-') {
			if (c == '-') {
				change = 1;
				if (lastSign == '+') {
					minAnswer += stoi(num);
				}
				else {
					minAnswer -= stoi(num);
				}
				num = "";
				lastSign = '-';
			}
			else {
				if (change) {
					if (lastSign == '+') {
						minAnswer += stoi(num);
					}
					else {
						minAnswer -= stoi(num);
					}
					num = "";
					lastSign = '-';
				}
				else {
					if (lastSign == '+') {
						minAnswer += stoi(num);
					}
					else {
						minAnswer -= stoi(num);
					}
					num = "";
					lastSign = '+';
				}
			}
		}
		else {
			num += c;
		}
	}
	if (lastSign == '+') {
		minAnswer += stoi(num);
	}
	else {
		minAnswer -= stoi(num);
	}
	cout << minAnswer;
	cin >> num;

 

더 클린한 코드는 있겠지만.. 흠

 

여기서 애 먹었던 부분은 숫자string을 어떻게 int형으로 산수를 하지? 였다

 

일단 

string num="";

로 숫자를 저장할 공간을 마련해두고

num+=c;

하면 뒤에 계속 한자리 숫자가 붙는다

 

그리고 

stoi(num)을 하면

string이 int로 변환된다

 

결국 stoi() 함수가 다한 문제!!

 

<[백준/C++] 1464: 1로 만들기>

https://tonnykang.tistory.com/124

 

[백준,C++] 1463번: 1로 만들기

문제 정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다. X가 3으로 나누어 떨어지면, 3으로 나눈다. X가 2로 나누어 떨어지면, 2로 나눈다. 1을 뺀다. 정수 N이 주어졌을 때, 위와 같은 연산

tonnykang.tistory.com

 

반응형