본문 바로가기
알고리즘!/Greedy

[C/C++] 1541: 잃어버린 괄호

by soeayun 2023. 8. 24.

1542: 잃어버린 괄호 문제

 

이  문제는 -가 언제 나오냐가 중요하다. -가 나올 때 그 다음 -가 나올때 까지 합을 빼는 것이 괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 것이다. 또한 -가 나올 때마다 다음 -가 나올 때까지 합을 빼는 것이 가장 최소이기 때문에 현재에 이익이 문제 전체의 이익이 되는 Greedy 알고리즘의 일종이다.

 

 나는 배열 2개만 써서 구현하였지만 아예 -가 나올 때마다 부분 집합을 만들어서 (slice를 통해) 각 값을 더하거나 빼서 구현할 수도 있을 것 같다!!

 

아래는  소스코드다!! 

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

char arr[52];
int store[3];

int ContinueCalculate(int i,int max)
{
  
  if(arr[i]=='+')
  {
    store[0]+=store[1];
    store[1]=0;
  }
  else //숫자가 들어왔을때
    store[1]=store[1]*10+(arr[i]-48);
  if(i==max ||arr[i+1]=='-') //-이면 store[0]에다가 저장을 해둬야함!
  {
    store[0]+=store[1];
    store[1]=0;
  }
    
  return ++i;
}

int SplitMinus(int i,int max)
{
  int k=store[0]; 
  store[0]=0;
  i++;
  while(arr[i]!='-' && i<=max) //현재에 있는 위치에서 -가 있냐!
    {
      i=ContinueCalculate(i,max);      
    }   
  store[0]=k-store[0];
  store[1]=0;
  return i;
}


int main(void)
  {
    scanf("%s",arr);
    int n=strlen(arr);   
    int i=0;
    while(i<n)
      {
        if(arr[i]=='-')
        {          
          i=SplitMinus(i,n-1);
        }
        else
        {
          i=ContinueCalculate(i,n-1);
          
        }        
      }
    printf("%d",store[0]);
    
  }

'알고리즘! > Greedy' 카테고리의 다른 글

[C/C++] 백준 1931: 회의실 배정 (풀이)  (0) 2023.09.05
[C] 1026: 보물  (0) 2023.08.25