링크
https://www.acmicpc.net/problem/1541
1541번: 잃어버린 괄호
첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다
www.acmicpc.net
문제
입출력 예제
코드
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main(void)
{
string inputStr = "";
string num = "";
int answer = 0;
bool isMinus = false ;
cin >> inputStr;
for (int i = 0; i < inputStr.size(); i++)
{
// 기호가 검출 되었을 경우
if (inputStr[i] == '-' || inputStr[i] == '+')
{
if (isMinus)
{
answer -= stoi(num);
num = "";
}
else if (!isMinus)
{
answer += stoi(num);
num = "";
}
// 마이너스가 한번이라도 나왔다면 이후 모든 수의 합을 음수로 바꿀 수 있음
if (inputStr[i] == '-') isMinus = true;
}
// 숫자가 검출 되었을 경우
else
{
num += inputStr[i];
}
}
// 반복문 종료 후 남은 숫자 처리
if (isMinus)
{
answer -= stoi(num);
}
else if (!isMinus)
{
answer += stoi(num);
}
cout << answer;
return 0;
}
풀이
값의 최소를 구해야 하고, 괄호를 원하는대로 칠 수 있습니다.
이는 마이너스 기호가 한번이라도 등장한다면 마이너스 이후의 모든 덧셈 결과들을 음수로 바꿀 수 있다는 뜻입니다.
해당 내용을 코드로 다음과 같이 구현했습니다.
1. for문을 이용해 input으로 받은 식의 각 인덱스를 모두 탐색한다.
2. 숫자가 등장한다면 string 자료형인 num 변수에 해당 숫자를 문자열로 쌓아줍니다.
3. '-' 기호가 등장했다면 isMinus를 true로 바꿔줍니다.
이후 num에 저장되어 있는 문자열을 stoi를 이용해 int형으로 변환하여 answer에 더해줍니다.
만약 isMinus가 true라면 answer에서 해당 수를 빼 줍니다.
이후 num 변수를 초기화합니다.
4. '+'기호가 나왔다면 isMinus의 값에 따라 true면 num의 수를 answer에 더해주고, false라면 빼 줍니다.
num 변수를 초기화 하는 과정도 진행해 줍니다.
5. for문이 끝났다면 num에 남아있는 수를 isMinus의 값에 따라 answer에 더하거나 빼 줍니다.
6. 결과값을 출력합니다.
다음과 같은 과정을 통해
55-50+40
의 예시의 경우 55 -(50 + 40) 과 같이 마이너스 기호 이후의 모든 수의 합을 음수로 바꿔줄 수 있습니다.
'[게임 개발] 알고리즘 공부 > 백준' 카테고리의 다른 글
[C++] [실버 1] 9009번: 피보나치 (1) | 2023.10.15 |
---|---|
[C++] 16953번: A -> B (0) | 2023.10.15 |
[C++] 5568번: 카드 놓기 (0) | 2023.08.13 |
[C++] 1182번: 부분수열의 합 (0) | 2023.08.12 |
[C++] 1120번: 문자열 (0) | 2023.08.10 |