본문 바로가기
개발 노트/백준, 프로그래머스 풀이

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

by tokkiC 2022. 6. 24.

문제를 이해하지 못하고 조건을 설정해서 괄호문자를 넣으려 했다가 실패했다

생각보다 조건이 까다로웠기 때문이다. 하지만 내가 직접 괄호를 넣어서 새 문자열을 만들라는 말이 아니라

결과만 최소가 되도록 괄호를 사용한 "것처럼" 만들면 되는 것이었다

그렇다면 어떤 결과가 최소가 되는 결과일까?

첫 -가 나온 후로 +는 괄호로 묶어서 모두 -로 뺄셈 처리가 되도록 하면 된다

하나씩 문자를 세며 기호가 나왔다면 ' -' 가 처음 나오기 전의 수였다면 결과에 양수로 그대로 더해주고

첫   ' - ' 이후에 나온 +나 - 등의 모든 기호는 앞의 수여도 이미 그 수 전에 -가 있으므로 결과에 -처리를 시킨다

마지막 요소로 쓸 숫자를 세기 위해서 숫자의 끝에도 기호로 세서 판단할 것이 있어야 하는데

string 의 끝에는 널 종단 문자열 ' \n ' 이 있으므로 널 종단 문자전까지의 숫자를 세고 포함하여 계산하도록 한다

널 종단 문자열 말고도 strlen(문자열) 을 통해서 마지막 요소 숫자를 포함할 범위를 설정해줄 수 있다.

 

상당히 어려운 문제였다. 이런 문제가 시험에 나온다면 아직은 시간안에 풀... 아니다 꼭 풀수있도록 열공하자

#include <bits/stdc++.h>
using namespace std;


int main(){
	string s;
	cin >> s;	
	
	string temp="";
	int ret=0;
	int chk=0;
	int answer=0;
	
	for(int i=0; i<=s.size(); i++){		// 종단 문자도 포함해야하니 <=로!  괄호를 이용하면 첫 음수 이후 모든 기호는 -나 마찬가지다 
		if(s[i]=='-' || s[i]=='+' || s[i]=='\0'){	// 양수도 괄호를 계산한다는 이유로 -까지 묶어버리면 -가 되기 때문 
			if(chk==1)			// 첫 -인지 아닌지 카운트로 판별, 1은 한번이상 앞에 -가 온적이 있다는 말이다 
				ret -= stoi(temp);		// 첫 -가 앞에 있으니 그 - 뒤는 모두 빼는 것과 같다 
			else 
				ret += stoi(temp);		// - 체크에서 1이 아닌 첫 -혹은 다른 기호라면 앞의 숫자는 양수이므로 그대로 결과에 더하자 
			
			if(s[i]=='-')
				chk=1;			// 첫 음수는 0일 것이니 그 후는 판별을 위해 1 로 할당한다 
				
			temp="";
		} else {				// 기호가 아닌 숫자가 오면 
			temp+=s[i];			// temp 에 수를 저장해둔다  
		}		
	}
	cout << ret << "\n";
		
	return 0;
}

 

 

댓글