백준 1541번 잃어버린 괄호 문제입니다.
자세한 내용은 문제를 읽어보시길 바랍니다.
https://www.acmicpc.net/problem/1541
접근방법
문제 자체는 별로 어렵지 않은데, 이상한 곳에서 좀 시간을 잡아먹었던 문제입니다.
먼저, 이 문제는 계산식을 문자열로 입력받아서 괄호를 사용해 가장 낮은 결과를 얻는 문제입니다.
문자열 자체는 저희가 임의로 설정하는 것이기 때문에 문자열을 수정할 필요는 없습니다.
해결법은 간단하게 최초의 -가 나올 때까지 모든 수를 결과에 더해주고,
-가 나온 이후의 숫자를 모두 빼주시면 해결 가능합니다.
예를 들어 55-50+40-90+58-54과 같은 수식이 있을 때, - 이후의 모든 식은
55-(50+40)-(90+58)-54와 같이 바꿀 수 있습니다.
그런데 주의해야 할 점은 식에서 -가 한 번도 나오지 않을 수도 있다는 점입니다.
저도 이 부분 때문에 이유도 모르고 문제를 계속 틀렸었는데, 여기서 시간이 좀 걸렸습니다. ㅠ
자세한 부분은 코드를 보면서 설명해보겠습니다.
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main() {
char math[51];
char num[6];
int i = 0, j = 0, result = 0, flag = 0;
scanf("%s", math);
while (math[i] != NULL){
if (math[i] == '+' || math[i] == '-') {
flag ? (result -= atoi(num)) : (result += atoi(num));
memset(num, NULL, 6);
j = 0;
if (math[i] == '-') flag = 1;
}
else {
num[j] = math[i];
j++;
}
i++;
}
flag ? (result -= atoi(num)) : (result += atoi(num));
printf("%d", result);
return 0;
}
수식을 입력받을 배열 math를 선언합니다. 크기가 51인 이유는 마지막에 NULL이 들어가기때문 입니다.
수식에서 숫자를 입력받을 배열 num을 선언합니다.
숫자는 최대 5자리이고, 끝에 NULL이 들어가서 크기가 6입니다.
while문을 사용해 math배열을 처음부터 끝까지 한 문자씩 읽어옵니다.
이후 조건문을 사용해 해당 위치의 문자가 '+' 또는 '-' 인지 아닌지 판단하는데,
후자의 경우엔 위치의 문자가 숫자라는 의미기 때문에 num배열에 저장해줍니다.
전자의 경우 지금까지 '-'가 나왔었는지 flag를 사용해 판단하고, 결과에 따라 계산을 수행합니다.
-가 나왔을 경우 result에서 숫자를 빼고, 안 나왔다면 더해줍니다.
계산을 수행한 후 memset을 사용해 num배열의 모든 값을 NULL로 바꿔줍니다.
반복문을 모두 수행했다면, '-'가 나왔는지 여부에 따라 마지막 숫자를 결과에서 더하거나 빼줍니다.
마지막으로 결과를 출력하면 끝입니다.
쉬운 문제였는데 잘 생각을 하지 않아서 발목을 잡혔던 문제입니다.
여러분은 저 같은 실수 하지 마시고, 문제 푸실 때 잘 이해하면서 푸시길 바랍니다.
'백준' 카테고리의 다른 글
백준1449번. 수리공 항승(파이썬) (0) | 2020.11.23 |
---|---|
백준 2529번. 부등호 (C언어) (0) | 2020.08.14 |
백준 1049번. 기타줄 (C언어) (0) | 2020.08.13 |
백준 10610번. 30 (C언어) (0) | 2020.08.12 |
백준1931번. 회의실배정(C언어) (0) | 2020.08.10 |