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
반응형
'하루 1문제 챌린지 > Gold2' 카테고리의 다른 글
백준 4195번 친구 네트워크(C++) (0) | 2024.03.02 |
---|---|
백준 10775번 공항(C++)🚩🚩 (0) | 2024.02.29 |
백준 2637 장난감 조립 (C++) (1) | 2024.01.31 |