Notice
Recent Posts
Recent Comments
Link
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
관리 메뉴

dh-winternagi 님의 블로그

(1541) 잃어버린 괄호 본문

백준 (C++)/Solve

(1541) 잃어버린 괄호

dh-winternagi 2026. 4. 18. 10:15

https://www.acmicpc.net/problem/1541

단계별로 풀어보기

23단계(그리디 알고리즘) 4번째

 

 

 

값을 최소로 하려면 빼기 뒤에 나오는 수가 최대가 되도록 해야 하며, 이는 빼기 뒤에 있는 더하기를 전부 괄호로 묶으면 된다.

빼기가 여러 개 나오더라도 제외하고 묶으면 첫 번째 빼기 뒤의 모든 수를 빼는 식을 만들 수 있으므로, 두 가지 경우로 단순화할 수 있다.

1) 식의 모든 연산자가 +일 땐 모든 수를 더한 값이 유일하게 가능한 해이다.

2) 식에 - 연산자가 있을 땐 -의 앞에 나오는 수들의 합에서 뒤에 나오는 수들의 합을 뺀 값이 가능한 최소값이다.

사실 더 큰 문제는 식이 그냥 문자열 하나로 주어지기 때문에 파싱을 해야 한다는 점이다(귀찮아서 예전 계정에서 썼던 파싱 코드를 가져왔다).

 

 

 

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int addsum(string str){
  int i=0, len=0, sum=0;
  for(int j=0;j<str.length();j++){
    if(str.find('+',j)==string::npos&&str.find('-',j)==string::npos){
      int x= stoi(str.substr(i, string::npos));
      sum+= x;
      break;
    }else if(str[j]=='+'||str[j]=='-'){
      int x= stoi(str.substr(i, len));
      sum+= x;
      i= j+1;
    }else{
      len++;
    }
  }
  return sum;
}

int main() {
  string s;
  
  cin >> s;

  if(s.find('-')==string::npos){
    cout << addsum(s);
  }else{
    int a= s.find('-');
    cout << addsum(s.substr(0,a))-addsum(s.substr(a+1));
  }
  
  return 0;
}

'백준 (C++) > Solve' 카테고리의 다른 글

(2630) 색종이 만들기  (0) 2026.04.18
(13305) 주유소  (0) 2026.04.18
(11399) ATM  (0) 2026.04.18
(1931) 회의실 배정  (0) 2026.04.18
(11047) 동전 0  (0) 2026.04.18