[C언어] 백준 1541 : 잃어버린 괄호

mainsain·2022년 3월 29일
0

백준

목록 보기
56/64

생각의 흐름

마이너스를 기준으로 괄호를 쳐주면 된다.
55 - (50 + 40) = - 35
이런식으로 최솟값을 구해주면 된다.
어떤식으로 진행해야되나 고민했는데 문자열형태로 받아야된다고 생각했다. -와 +를 처리해야되기 때문이다.
그러면 str배열에 55-50+40 을 입력하면 str[0] = '5', str[1] = '5', str[2] = '-'... 이런식으로 저장되는데 먼저 각 자릿수를 int형으로 즉 '5' '5'를 숫자 55로 바꾸어주어야 하는구나 싶었다.
그리고 '-'가 있으면 따로 빼서 처리를 해주어야 하는데 중간에 +가 끼어있어서 코드가 길어졌다.. 잘 먹지도 않고..
결국 다른사람 코드를 봤다..

내가 막힌 부분

while (i < len)
	{
		if (str[i] == '-')
		{
			i = i + 1;
			while (str[i] != '\0' || str[i] == '-')
			{
				if (str[i] >= '0' && str[i] <= '9')
				{
					sum = sum * 10;
					sum = sum + str[i] - '0';
				}
				else if (str[i + 1] == '\0' || str[i + 1] == '-' || str[i + 1] == '+')
				{
					arr[k] = sum * -1;
					sum = 0;
					k++;
				}
				i++;
			}
		}

else if 부분에서 자꾸 이상하게 빠졌다. +같은 그런걸 처리해주려고 했는데 시간이 너무 소모됐다.. 다른사람 코드 보고 이해를 해보자.

다른 사람 코드

#include <stdio.h>
#include <string.h>

int main(void)
{
	char str[51];
	int arr[25] = {0};
	scanf("%s", str);
	int len = strlen(str);
	int i, j = 0, k = 0, temp = 0, sum = 0, result = 0;

	for (i = 0; i <= len; i++)
	{
		if (str[i] == '-' || i == len)
		{
			sum = sum + temp;
			arr[j] = sum;
			j++;
			temp = 0;
			sum = 0;
		}
		else if (str[i] == '+')
		{
			sum = sum + temp;
			temp = 0;
		}
		else
		{
			temp = temp * 10;
			temp = temp + str[i] - '0';
		}
	}

	result = arr[0];
	for (i = 1; i < j; i++)
	{
		result = result - arr[i];
	}
	printf("%d", result);
}

https://henrynoh.tistory.com/20
논리는 같다. 목표도 같았다.. int형 배열을 마지막에 계산해주는 방법
반복문을 한개만 사용하고, - +가 아닐 경우 숫자를 쌓는다. 그리고 -+를 보면 쌓은 숫자들을 저장시킨다.
디테일한건 i == len조건인데, 마지막보다 한번 더 돌리면서 끝까지 저장할 수 있다. 이건 디버깅을 해보면 직관적으로 알 수 있다.

또 다른 사람 코드

#include<stdio.h>

void main(){
   int i=0,n,a; char c;

   //for문을 이용해 입력 및 조건식 처리
   for(scanf("%d",&n);scanf("%c",&c),c!=10;){

      //-일때 i=1로 바꿔준다.
      if(c=='-') i=1;
      scanf("%d",&a);

      //i=1일때, 즉, -부호가 최초로 들어왔을 때 n에서 계속 빼준다.
      if(i) n-=a;

     //i=0, 즉 아직 -부호가 들어오지 않았거나, 처음 입력받았을 땐 n에 입력받은 수를 더해준다.
      else n+=a;
   }
   printf("%d",n);
}

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=occidere&logNo=220833166496
진짜 미친 방법인것같다. for문으로 조건들을 scanf로 받으면서 바로바로 계산을 해준다.
저 for문이 어떤식으로 돌아가는지 자세히는 모르지만, 진짜 미친것 같다..

근데 이 문제가 왜 그리디일까
그냥 문자열문제인것같다..

profile
새로운 자극을 주세요.

0개의 댓글