2023. 6. 12. 22:20, 알고리즘/BOJ
#include <bits/stdc++.h>
using namespace std;
int t;
int n;
int a[1'005];
int m;
int b[1'005];
vector<int> sum1;
vector<int> sum2;
long long ans;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin>>t;
cin>>n;
for(int i=0; i<n; i++) cin>>a[i];
cin>>m;
for(int i=0; i<m; i++) cin>>b[i];
for(int i=0; i<n; i++){
for(int j=i;j<n; j++){
if(i==j) sum1.push_back(a[i]);
else{
int tmp=0;
for(int p=i; p<=j;p++) tmp+=a[p];
sum1.push_back(tmp);
}
}
}
// cout<<"sum1 size is : "<<sum1.size()<<'\n';
for(int i=0; i<m; i++){
for(int j=i;j<m; j++){
if(i==j) sum2.push_back(b[i]);
else{
int tmp=0;
for(int p=i; p<=j;p++) tmp+=b[p];
sum2.push_back(tmp);
}
}
}
// cout<<"sum2 size is : "<<sum2.size()<<'\n';
// for(auto c: sum1){
// cout<<c<<' ';
// }
// cout<<'\n';
// for(auto c: sum2){
// cout<<c<<' ';
// }
// cout<<'\n';
sort(sum2.begin(),sum2.end());
for(auto c: sum1){
auto up=upper_bound(sum2.begin(),sum2.end(),t-c);
auto lb=lower_bound(sum2.begin(),sum2.end(),t-c);
int cnt=up-lb;
ans+=cnt;
}
cout<<ans;
}
//건너뛰면 안된다. 건너뛰어서 원소들끼리 골라내서 합치는게 아니라
//그냥 쭉 일렬로 어디서부터 어디까지 구멍 없이 다 합쳐야 한다.
//2중 for문으로 a의 원소들을 합친 경우의 수들중에서, 투포인터로 b의 배열들의
//합을 탐색하면,안된다. 투포인터는 정렬이 되어있어야지.
//그냥 이중for문 하고, 그리고 이분탐색으로 해야겠다.
boj 2413번 문제에 대한 내가 작성한 코드의 경우 문제가 없다고 생각했는데 제출했을때 지속적으로 실패가 되어서,
참고 코드를 확인했는데 그것도 결국 내가 만든 코드와 맥락이 같았고, 단순하게 차이점이라면 부분합을 만드는 경우를 dp를 이용하여서 시간복잡도를 줄였다는것, 그리고 long long 으로 모든 타입들을 설정했다는것인데,
아무리 생각해도 원소가 1000개씩 주어지는거라 dp로 줄일 필요까지 없어 보이고, 분명 범위도 마지막 ans만 long long 으로 처리하면 될 것 같은데 문제될 부분이 없어서 지속적으로 이곳저곳 long long 으로 바꿔가면서 문제를 제출해보았다.
그러다가 sort(sum1.begin(),sum1.end()); 도 추가해보았는데, 이것도 사실 전혀 필요없는 연산이라고 생각했는데,
넣고나서 제출하니 역시 틀렸고,
그러다 다시 살펴보니
분명 sum2를 sort해야 하는 부분이 있었어야 하는데 보이지 않아서 보니까,
// cout<<"sum2 size is : "<<sum2.size()<<'\n';
// for(auto c: sum1){
// cout<<c<<' ';
// }
// cout<<'\n';
// sort(sum2.begin(),sum2.end());
// for(auto c: sum2){
// cout<<c<<' ';
// }
// cout<<'\n';
이런식으로 중간에 내가 흐름을 확인하기 위해서 작성했던 cout 코드들을 주석처리 할때 중간에 섞여 들어가서 주석처리가 같이 되어버렸다. sort sum2의 경우는 아래에서 이분 탐색을 할때 필요한 로직이었는데 그게 없어져 버리면서 지속적으로 틀리게 된 것이다.
다음에는 주석 처리를 할때 그냥 영역 전체를 주석처리 하기 보다는, 하나하나 확인하면서 주석 처리를 하던지,
아니면 이렇게 필요한 연산의 경우는 주석처리 해버릴 부분에 같이 섞어서 작성하지 않도록 하자.
'알고리즘 > BOJ' 카테고리의 다른 글
boj 2110 공유기 설치 문제를 통한 lower_bound 함수를 통한 반복적 판단코드 작성하기. (0) | 2023.06.13 |
---|---|
boj 2110 공유기 설치.(투포인터라고 생각했었는데 다시보니 이분탐색인 풀이법에 대하여) (0) | 2023.06.12 |
boj 1253 문제에 대한 참고사항 블로그. (0) | 2023.06.11 |
boj 3015: 합이 0, boj 2473번: 세 용액// 두가지 문제에서 투 포인터 풀이의 차이점에 대하여. (0) | 2023.06.11 |
c++ long long 의 범위 내에서의 최대값을 16진수로 표현하는 방법에 대하여. 0x7f7f7f7f7f7f (0) | 2023.06.10 |
Comments, Trackbacks