코딩테스트/백준

[백준][C++]1744번 수 묶기

윤깡패 2023. 6. 9. 19:52

문제

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

 

1744번: 수 묶기

길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에

www.acmicpc.net

 

 

풀이

  • 가능한 한 큰 수들끼리 묶어야 결괏값이 커진다.
  • 음수끼리 곱하면 양수로 변한다.

 

그리디(Greedy) 알고리즘

 

그리디(Greedy) 알고리즘

그리디(Greedy) 알고리즘 현재 상태에서 볼 수 있는 선택지 중에 최선의 선택을 하는 알고리즘 + 구현하기 쉽다. + 시간 복잡도가 우수하다. - 항상 최적의 해를 보장하지 못한다. 그리디 알고리즘

soobin0821.tistory.com

 

 

코드

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);

  int N;
  cin >> N;
  
  vector<int> plus;
  vector<int> minus;
  int zero = 0;
 
  int num;
  for(int i = 0; i < N; i++)
  {
    cin >> num;
    
    if(num == 0)
    {
      zero++;
    }
    else if(num > 0)
    {
      plus.push_back(num);
    }
    else
    {
      minus.push_back(-num);
    }
  }

  sort(plus.begin(), plus.end());
  sort(minus.begin(), minus.end());

  int result = 0;
  
  int start_index = 0;
  if(plus.size() % 2 == 1)
  {
    result += plus[0];
    start_index = 1;
  }
  for(int i = plus.size() - 1; i >= start_index; i = i - 2)
  {
    result = result + max((plus[i] * plus[i - 1]), plus[i] + plus[i - 1]);
  }

  if(minus.size() % 2 == 1)
  {
    if(zero <= 0)
    {
      result -= minus[0];
      start_index = 1;      
    }
  }
  for(int i = minus.size() - 1; i >= start_index; i = i - 2)
  {
    result += (minus[i] * minus[i - 1]);
  }

  cout << result;

  return 0;
}

 

 

 

728x90