[백준1541]잃어버린 괄호

뚱환·2023년 4월 13일
0

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

입력

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

출력

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

아이디어

그리디 문제의 정석 최솟값을 만들기 위해서는 가능한 큰 수를 빼야한다.
그러므로 더하기 연산들만 먼저 모아서 모두 더하고 그 후 빼면 문제가 해결된다.

vector<string> split(string input, char delimiter)
{
	vector<string>result;
	stringstream mystream(input);
	string splitdata;

	while (getline(mystream, splitdata, delimiter))
	{
		result.push_back(splitdata);
		}
	return result;
}

문자를 기준으로 vector 컨테이너에 수를 저장하는 split 함수
파이썬 등에는 내장함수로 존재하지만 c++에서는 지원하지 않아
코테를 보려면 외워야한다.

string example
vector<string>temp = split(example, '+');

첫번째 매개변수는 넣을 문자열 두번째 매개변수는 파티션할 기준문자이다.

int mySum(string a)
{
	int sum = 0;
	vector<string>temp = split(a, '+');

	for (int i = 0; i < temp.size(); i++)
	{
		sum += stoi(temp[i]);
	}
	return sum;
}

두번째함수 -기준으로 먼저 가르고 나온 문자들을 모두 stoi로 합하여 저장해주는 간단한 함수이다.
이 안에서 다시 한 번 split을 호출하여 -기준으로 가르고 나온 +수들을 다시 갈라 stoi로 정수로 변환하여 다 합하여준다.

for (int i = 0; i < str.size(); i++)
	{
		
		int temp = mySum(str[i]);
		if (i == 0)
		{
			answer += temp;
		}
		else {
			answer -= temp;
		}
	}

main에서는 간단하게 mysum으로 나온 합들을 전체답 변수에서 빼준다.
i가 0일때 더하는 이유는 앞에 수가 없으면 무조건 양수이기 때문에 먼저 더하고 시작하여준다.

느낀점 split 함수를 c++에서는 외워야겠구나.

다른 이의 코드

void solve(void)
{
	for (int i = 0; i <= s.size(); ++i){
		if (s[i] == '+' || s[i] == '-' || s[i] == '\0'){
			if (m) {
				num -= stoi(tmp);
			}
			else {
				num += stoi(tmp);
			}
 
			if (s[i] == '-') {
				m = 1;
			}
 
			tmp = "";
			continue;
		}
 
		tmp += s[i];
	}
}
 

이렇게 더 간단하게도 할 수 있다.

profile
https://github.com/lixxce5017/Algoritm_Weekly_Baekjoon

0개의 댓글