알고리즘 풀이에서 중간에 cout으로 출력 찍어보고, 제출시에 주석 처리할때 필요한 로직을 주석처리 하지 않도록 하자.

 

#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의 경우는 아래에서 이분 탐색을 할때 필요한 로직이었는데 그게 없어져 버리면서 지속적으로 틀리게 된  것이다. 

다음에는 주석 처리를 할때 그냥 영역 전체를 주석처리 하기 보다는, 하나하나 확인하면서 주석 처리를 하던지, 

아니면 이렇게 필요한 연산의 경우는 주석처리 해버릴 부분에 같이 섞어서 작성하지 않도록 하자. 

 

  Comments,     Trackbacks