전공/알고리즘
백준 1541(잃어버린 괄호)
xkdlaldfjtnl
2020. 6. 8. 12:46
https://www.acmicpc.net/problem/1541
1541번: 잃어버린 괄호
첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다
www.acmicpc.net
어떤 +, -와 숫자로 이루어진 수식을 입력받아서 괄호를 마음대로 넣어서 최솟값을 만드는 문제이다.
좀만 생각해보면 -연산자 뒤에는 모두 -로 만들 수 있다는 것을 알 수 있다.
처음에는 전체로 입력받아서 하나하나 조사할 생각을 안 하고 하나하나 따로 입력 받을 수 있는 방법이 있는가라는 착각을 해서 문제를 더 어렵게 생각하게 만들었지만 그게 아니었다.
이 문제는
string 으로 수식을 입력받아서
하나하나 조사한다.
어떤 수의 자릿수를 확인하기 위해서 재귀적 성질을 사용할까 생각을 해보았지만 엄청난 낭비인 것 같아서 바로 접었다. 그래서 여러 변수들을 선언해서 자릿수를 파악하고, 그 자릿수에 맞는 10의 거듭제곱 꼴로 곱해서 더해서 결과를 구하였다.
string 클래스에 익숙해져야 하고,
배열이나 문자열 특정 index에 접근할 때는 항상 그 index가 범위를 벗어나지는 않는지에 대한 생각을 잘 해야 한다.
예를 들어 반복문 안에 있는 조건문은 break의 위치를 잘 생각해야지 안 그러면 이미 오류가 발생 뒤에 논리적 결함이 없는 상태로 만드는 경우가 발생할 수 있다.
#include<iostream>
#include<string>
using namespace std;
string str;
int num;
int cnt;
int index;
int result = 0;
bool mminus = false;
int main() {
cin >> str;
for (int i = 0; i < str.length(); i++) {
cnt = 0;
num = 1;
index = i;
while (str.at(index) >= 48 && str.at(index) <= 57) {
cnt++;
index++;
if (index >= str.length()) break;
}
for (int j = 1; j < cnt; j++) {
num *= 10;
}
while (str.at(i) >= 48 && str.at(i) <= 57) {
if (mminus) {
result -= (str.at(i) - '0')*num;
}
else {
result += (str.at(i) - '0')*num;
}
num /= 10;
i++;
if (i >= str.length()) break;
}
if (i >= str.length()) break;
if (str.at(i) == '-') {
mminus = true;
}
}
cout << result << "\n";
}