본문 바로가기

백준

3649 로봇 프로젝트

 

이야 

이거 

두용액 문제 아녀??

 

왕년에 두 용액 문제 풀 때 피눈물 흘렸는데 이렇게 다시 보네.

그래서 두 용액 문제처럼 l이랑 r을 배열 끝을 가리키게 하고, 합과 비교해보면서 줄이고 싶으면 r을 늘리고 싶으면 l을 움직였다. 

 

 

어제 본 깔쌈한 코드처럼 짜려 했는데 포인터가 양 끝에 있어가지구 그냥 내가 편한대로 짰다ㅋㅋ

 

바로 코드로 옮김

 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
using i64 = long long;

int main() {
    i64 m, n;
    scanf("%lld %lld", &m, &n);
    
    vector<i64> v(n);
    
    m *= 10000000;
    
    for(int i = 0; i < n; i++){
        scanf("%lld", &v[i]);
    }
    
    sort(v.begin(), v.end());
    
    int l = 0, r = n-1;
    i64 sum = v[0]+v[r];
    
    while(l != r-1){
        if(sum > m){
            sum -= v[r--];
            sum += v[r];
        }
        else if(sum < m){
            sum -= v[l++];
            sum += v[l];
        }
        else
            break;
    }
    
    
    if(sum == m)
        printf("yes %lld %lld", v[l], v[r]);
    else
        printf("danger");

    return 0;
}

 

테스트 케이스도 넣어서 확인해보고 코드 제출했는데 틀렸다. 왜지

 

로봇 프로젝트는 실패했습니다. 

 

점심 먹고 다시 생각해봐야겠다. 아마 오버플로우 때문이지 않을까??? 아마???

 


#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
using i64 = long long;

int main() {
    i64 m, n;
    while(scanf("%lld %lld", &m, &n) == 2){
        vector<i64> v(n);
        
        m *= 10000000;
        
        for(int i = 0; i < n; i++){
            scanf("%lld", &v[i]);
        }
        
        sort(v.begin(), v.end());
        
        int l = 0, r = n-1;
        i64 sum = v[0]+v[r];
        
        while(l != r-1){
            if(sum > m){
                sum -= v[r--];
                sum += v[r];
            }
            else if(sum < m){
                sum -= v[l++];
                sum += v[l];
            }
            else
                break;
        }
        
        if(sum == m)
            printf("yes %lld %lld\n", v[l], v[r]);
        else
            printf("danger\n");
    }

    return 0;
}

 

결국 검색했고 문제를 찾았다ㅋㅋㅋ

"입력은 여러 개의 테스트 케이스로 이루어져 있다" 아 이걸 놓쳤다. 입력 개수가 안 주어진 건 어찌하지 하다가 다른 사람 코드 참고했다. 허버버

 

음.. 하지만 이제는 런타임 에러...

 

아 이거 전의 에러랑 비슷한 것 같다. 범위 벗어나서 런타임 에러 뜬 듯 고쳐봐야지

잉 아닌데?? 중간으로 가는 거잖아 이건

 

 


 

아 이게 문제가

while(l != r-1) 이렇게 하면 n이 1일 때 무한루프에 빠진다. 게다가 조각이 하나이거나 0개이면 danger 해주는 것도 빠졌다. (아니 이런건 입력에서 제외시켜주지) 그래서 수정해서 코드 제출했는데 틀렸습니다..

 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
using i64 = long long;

int main() {
    i64 m, n;
    while(scanf("%lld %lld", &m, &n) == 2){
        vector<i64> v(n);
        
        m *= 10000000;
        
        for(int i = 0; i < n; i++){
            scanf("%lld", &v[i]);
        }
        
        sort(v.begin(), v.end());
        
        int l = 0, r = n-1;
        
        if(n == 1 || n==0){
            printf("danger\n");
            continue;
        }
        i64 sum = v[0]+v[r];
        
        while(l < r){
            if(sum > m){
                sum -= v[r--];
                sum += v[r];
            }
            else if(sum < m){
                sum -= v[l++];
                sum += v[l];
            }
            else
                break;
        }
        
        if(sum == m)
            printf("yes %lld %lld\n", v[l], v[r]);
        else
            printf("danger\n");
    }

    return 0;
}

 

원본 소스인 두 용액이랑 비교할려고 두 용액 문제 다시 봤더니 sum에 더하고 뺴지 않고 l이랑 r만 값을 바꾼다. 그래서 나도 똑같이 바꿨더니 맞았다. 엥?? 좀 당황스러웠음 뭐가 문제였던 거지?? 하지만 맞으니 행복합니다 오예

 

다음에는 조건 l < r로 두고 포인터만 바꾸기... 기억해야겠다.

 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
using i64 = long long;

int main() {
    i64 m, n;
    while(scanf("%lld %lld", &m, &n) == 2){
        vector<i64> v(n);
        
        m *= 10000000;
        
        for(int i = 0; i < n; i++){
            scanf("%lld", &v[i]);
        }
        sort(v.begin(), v.end());
        
        if(n == 1 || n==0){
            printf("danger\n");
            continue;
        }
        
        int l = 0, r = n-1;
        i64 sum;
        
        while(l < r){
            sum = v[l]+v[r];
            
            if(sum > m){
                r--;
            }
            else if(sum < m){
                l++;
            }
            else
                break;
        }
        
        if(sum == m)
            printf("yes %lld %lld\n", v[l], v[r]);
        else
            printf("danger\n");
    }

    return 0;
}

 

 

성공한 로봇 프로젝트

으휴 힘들었고 다시는 보지말자

'백준' 카테고리의 다른 글

15650 N과 M (2)  (0) 2020.02.19
15649 N과 M (1)  (0) 2020.02.19
1806 부분합  (0) 2019.12.30
1644 소수의 연속합  (0) 2019.12.30
2669 직사각형 네개의 합집합의 면적 구하기  (0) 2019.12.29