어흥

[백준 1744] 수 묶기 (C++) 본문

알고리즘/백준

[백준 1744] 수 묶기 (C++)

라이언납시오 2021. 2. 8. 16:05
728x90
반응형

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

 

1744번: 수 묶기

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

www.acmicpc.net

1. 주의할 점

- 음수/0/양수로 나눈다

- 음수의 경우, 0과 관련지어서 생각한다

- 양수의 경우, 1일 때 조건을 추가한다

 

2. 구현 (이해가 안되는 부분은 코드에 주석을 달았으니 확인 바람)

- 수를 입력 받을 때, 음수인 경우 M에 양수인 경우 P에 추가한다. 0인 경우, Zero++를 수행한다

- 음수의 경우 오름차순으로, 양수는 내림차순으로 정렬한 이후, 음수->0->양수 순서대로 Arr[] 배열에 담는다

- Arr[] 모든 배열을 For문을 통해 현재 값을 Cur, 다음 값을 Next에 할당한다

- 만약 Cur이 음수이며, 다음 수가 존재할 경우 Next를 확인한다. 이때, Next가 음수라면 Cur*Next를 Result에 더한다(음수*음수=양수). Next가 0이라면 둘이 곱한 0이 더했을때(음수)보다 크므로 곱한 후, 더한다고 가정한다. 만약 Next가 양수라면 Cur를 Result에 더한다

- 다음 수가 없다면 그대로 Result에 더한다

- Cur이 0이면 건너뛴다

- Cur이 양수면, 1인지 확인한다. 1이라면 Result에 1을 더한다. (Result + 1*Next <= Result 1+Next가 성립하기 때문)

- 1이 아니라면, 다음 수가 있는지 확인한다. 다음수가 없다면 그대로 더하고, Next가 존재하면 곱한 이후 더한다

 

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
vector<int> m,p;
int arr[10001];

int main() {
    int num,result=0,cur,next,zero=0,a;
    cin>>num;
    for(int i=0;i<num;i++){
        cin >> a;
        if(a<0)
            m.push_back(a);
        else if(a>0)
            p.push_back(a);
        else
            zero++;
    }
    sort(m.begin(),m.end());
    sort(p.begin(),p.end(),greater<int>());
    int idx=0;
    for(int i=0;i<m.size();i++)
        arr[idx++]=m[i];
    for(int i=0;i<zero;i++)
        arr[idx++]=0;
    for(int i=0;i<p.size();i++)
        arr[idx++]=p[i];
    for(int i=0;i<num;i++){
        cur = arr[i];
        if(cur<0){
            if(i+1<num){        //다음 수가 있는 경우
                next = arr[i+1];
                if(next==0)    //cur*next=0, result+=0 => result
                    i++;
                else if(next<0){
                    i++;
                    result+=(cur*next);
                }
                else   //next>0
                    result+=cur;
            }
            else           //다음 수가 없는 경우
                result+=cur;
        }
        else if(cur > 0){       //1인 경우 예외 존재 2*1보다 2+1이 더 큼
            if(cur==1){
                result+=1;
                continue;
            } 
            if(i+1<num){        
                next = arr[i+1];
                if(next==1)
                    result+=(next+cur);
                else
                    result+=(cur*next);
                i++;
            }
            else
                result+=cur;
        }
    }
    cout<<result;
    return 0;
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 19236] 청소년 상어 (C++)  (0) 2021.02.10
[백준 15961] 회전 초밥 (C++)  (0) 2021.02.09
[백준 1253] 좋다 (C++)  (0) 2021.02.08
[백준 20366] 같이 눈사람 만들래? (C++)  (0) 2021.02.05
[백준 1406] 에디터 (C++)  (0) 2021.01.13
Comments