문제를 이해하지 못하고 조건을 설정해서 괄호문자를 넣으려 했다가 실패했다
생각보다 조건이 까다로웠기 때문이다. 하지만 내가 직접 괄호를 넣어서 새 문자열을 만들라는 말이 아니라
결과만 최소가 되도록 괄호를 사용한 "것처럼" 만들면 되는 것이었다
그렇다면 어떤 결과가 최소가 되는 결과일까?
첫 -가 나온 후로 +는 괄호로 묶어서 모두 -로 뺄셈 처리가 되도록 하면 된다
하나씩 문자를 세며 기호가 나왔다면 ' -' 가 처음 나오기 전의 수였다면 결과에 양수로 그대로 더해주고
첫 ' - ' 이후에 나온 +나 - 등의 모든 기호는 앞의 수여도 이미 그 수 전에 -가 있으므로 결과에 -처리를 시킨다
마지막 요소로 쓸 숫자를 세기 위해서 숫자의 끝에도 기호로 세서 판단할 것이 있어야 하는데
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;
}
'개발 노트 > 백준, 프로그래머스 풀이' 카테고리의 다른 글
[백준 1316/c++] 그룹 단어 체커 - 문자열 (0) | 2022.06.24 |
---|---|
[백준 1004/c++] 어린 왕자 - 구현 (0) | 2022.06.24 |
[백준 9012/c++] 괄호 - 문자열 - 스택 (0) | 2022.06.23 |
[백준 4673/c++] 셀프 넘버 (0) | 2022.06.23 |
[프로그래머스 1 / c++] 숫자 문자열과 영단어 -map (0) | 2022.06.22 |
댓글