[백준/c++] 1744번: 수 묶기

somyeong·2022년 6월 8일
0

백준

목록 보기
39/45

문제 링크 - https://www.acmicpc.net/problem/1744

🌱 문제


🌱 풀이 및 코드

  • 너무 노가다로 푼 것 같긴 하다...
//1744. 수 묶기
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int n;
int answer;
int cnt_minus;
int cnt_plus;
int plus_index;
bool zero;// 0 존재하면 true, 존재안하면 false

int main(){
    cin>>n;
    vector<int> v(n);

    for(int i=0; i<n; i++){ //양수,음수 갯수 카운트
        cin>>v[i]; 
        if(v[i]>0)
            cnt_plus++;
        if(v[i]<0)
            cnt_minus++;
        if(v[i]==0)
            zero=true;
    }

    sort(v.begin(),v.end()); //오른차순 정렬

    for(int i=0; i<n; i++){
        if(v[i]>0){ //plus_index: 양수의 시작 인덱스
            plus_index=i;
            break;
        }
    }

    if(cnt_plus==0){ //양수가 없으면
        if(zero==true){//0이 있으면 
            plus_index=n-1;
        }else{ //0이 없으면
            plus_index=n;
        }
    }

    for(int i=plus_index; i<n; i++){ //양수 살펴보기
        if(cnt_plus%2==1){//양수가 홀수개면, 처음양수그냥 더하고 나머지는 두개씩 곱해서 answer에 더하기
            if(i==plus_index)
                answer+=v[i];
            else{
                if(i+1<n){
                    if(v[i]*v[i+1]>v[i]+v[i+1]) // 예제5 같은 경우있을수있으니, 곱해서 더한것과 각각 더한것중 더 큰것 확인
                        answer+=v[i]*v[i+1];
                    else
                        answer+=(v[i]+v[i+1]);
                    i++; //두 수 확인했으니까 i++ 해주어야함.
                }
            }
        }else{// 양수가 짝수개면 두개씩 곱해서 answer에 더하기
            if(i+1<n){
                  if(v[i]*v[i+1]>v[i]+v[i+1])
                        answer+=v[i]*v[i+1];
                    else
                        answer+=(v[i]+v[i+1]);
                i++;
            }
    
        }
    }

    for(int i=0; i<plus_index; i++){ //음수 살펴보기 
    // 음수가 홀수개던 짝수개던 두개씩 곱해서 answer에 더하면 되고, 홀수일경우 마지막 하나는 따로 answre에 더하면 됨
        if(i+1<plus_index){
            answer+=v[i]*v[i+1]; // 음수경우는 무조건 곱해서 더하는게 최댓값 만드는 방법임.
            i++;
        }else{
            answer+=v[i]; //홀수일경우 마지막 남은 음수 따로 더해주는 식
        }
       
    }

    cout<<answer<<"\n";
}

🌱 다른 코드

  • 바킹독 님의 깔끔한 코드 ..
// Authored by : heheHwang
// Co-authored by : BaaaaaaaaaaarkingDog
// http://boj.kr/4370940d344846289225c83a8c8b7889
#include <bits/stdc++.h>
using namespace std;

long long ans;
void seqSum(vector<int> v) {
  while (1 < v.size()) {
    ans += *(v.end() - 1) * *(v.end() - 2);
    v.pop_back();
    v.pop_back();
  }
  if (v.size())
    ans += v[0];
}
int main(void) {
  ios::sync_with_stdio(0);
  cin.tie(0);

  vector<int> seqP, seqN;
  int N, t;
  cin >> N;
  for (int i = 0; i < N; i++) {
    cin >> t;
    if (t == 1) ans++;
    else if (0 < t)
      seqP.push_back(t);
    else
      seqN.push_back(t);
  }
  sort(seqP.begin(), seqP.end());
  sort(seqN.begin(), seqN.end(), greater<>());
  seqSum(seqP);
  seqSum(seqN);
  cout << ans;
}

참고 - https://github.com/encrypted-def/basic-algo-lecture/blob/master/0x11/solutions/1744.cpp

profile
공부한 내용 잊어버리지 않게 기록하는 공간!

0개의 댓글