하루 1문제 챌린지/Gold2

백준 7453번 합이 0인 네 정수(C++)

그린푸딩 2024. 7. 7. 23:31
728x90
반응형

처음에 비트마스킹?으로 조합으로 풀수 있나 했는데 배열이 4개, n길이인것도 제대로 파악못하고 아무튼 시간초과..

블로그 찾아보니 브루트포스 4중 for문을 2중 for문으로 줄이면 된다는데 이방식 기억해야겠다. 

A+B, C+D 이것을 둘로 묶어서 합에 대한 배열에 저장했는데 그런데도 틀렸습니다가 떴다. 

배열들중에 같은 값들이 있는데 함부로 합이 0이됬다고 left,right를 바꾸면 안되는거 였다. 

예외 사항을 찾는게 참 어렵다.

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

using namespace std; 

int main()
{
    int n;
    cin>>n;
    vector<vector<long long>>arr; 
    arr.assign(4,vector<long long>(n,0));
    
    
    for(int i=0;i<n;i++){
        for(int j=0;j<4;j++){
            cin>>arr[j][i]; 
        }
    }
  
    vector<long long>A;
    vector<long long>B; 
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            long long a=arr[0][i];
            long long b=arr[1][j]; 
            A.push_back(a+b);
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            long long a=arr[2][i];
            long long b=arr[3][j]; 
            B.push_back(a+b);
        }
    }
    //정렬? 
    long long cnt=0;
    sort(A.begin(),A.end());
    sort(B.begin(),B.end()); 
    long long left=0; 
    long long right=B.size()-1; 
    
    while(left<A.size() && right>=0){
        if(A[left]+B[right]==0){
            
            //left++; right--; 이게 맞을까? 
            //같은거 있는데위치까지 쭉감. 
            long long a=1;
            long long b=1;
            while(right>0 && B[right]==B[right-1]){ 
                b++; 
                right--;
            }
            while(left<A.size()-1 && A[left]==A[left+1]){
                a++;
                left++; 
            }
            cnt+=a*b; 
            //????
            left++; right--;
           
        }
        else if(A[left]+B[right]<0){
            left++;
           
        }
        else{
            right--; 
        }
        
    }
    
    cout<<cnt;
    
    
    return 0;
}
728x90
반응형