-
백준 1541(잃어버린 괄호)전공/알고리즘 2020. 6. 8. 12:46
https://www.acmicpc.net/problem/1541
어떤 +, -와 숫자로 이루어진 수식을 입력받아서 괄호를 마음대로 넣어서 최솟값을 만드는 문제이다.
좀만 생각해보면 -연산자 뒤에는 모두 -로 만들 수 있다는 것을 알 수 있다.
처음에는 전체로 입력받아서 하나하나 조사할 생각을 안 하고 하나하나 따로 입력 받을 수 있는 방법이 있는가라는 착각을 해서 문제를 더 어렵게 생각하게 만들었지만 그게 아니었다.
이 문제는
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"; }
'전공 > 알고리즘' 카테고리의 다른 글
백준 1461(도서관) 맞왜틀? (0) 2020.06.09 백준 1080(행렬) (0) 2020.06.08 백준 2042(구간 합 구하기) (0) 2020.06.06 백준 1725(히스토그램)세그먼트 트리 (0) 2020.06.06 백준 12846(무서운 아르바이트)스택 (0) 2020.06.05