어흥

[백준 3649] 로봇 프로젝트 (C++) 본문

알고리즘/백준

[백준 3649] 로봇 프로젝트 (C++)

라이언납시오 2021. 2. 25. 18:04
728x90
반응형

문제 링크: www.acmicpc.net/problem/3649

 

3649번: 로봇 프로젝트

각 테스트 케이스마다 한 줄에 하나씩, 구멍을 완벽하게 막을 수 있는 두 조각이 없다면 'danger'를 출력한다. 막을 수 있는 경우에는 'yes ℓ1 ℓ2'를 출력한다. (ℓ1 ≤ ℓ2) 정답이 여러 개인 경우에

www.acmicpc.net

1. 주의할 점

- TC가 여러개 + 언제 끝나는지 알려주지 않음 -> EOF가 입력될 때까지 받는다

- 서로 다른 2 조각 사용

- TC마다 V 벡터 초기화

 

2. 구현

- if(cin>>len)을 통해 EOF를 입력 받았다면 false를, 아니라면 true를 입력 받기 때문에 EOF를 입력 받는다면 Break로 While문을 빠져 나간다

- 입력 받는 조각들을 오름차순으로 정렬한 이후, 양끝에서부터 안쪽으로 두 포인터를 이용하여 탐색한다(조각의 크기가 양수이므로 0의 경우 생각 안해도 된다)

- 만약 길이가 같다면 해당 조각들을 출력하고, 같지 않으면 l==r이 될때까지 조각 2개의 합(=Sum)이 구멍의 너비(=Len)보다 작다면 L++을 통해 조각의 합을 늘린다. 만약 반대로 작다면, R--를 통해 조각의 합을 줄인다

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    vector<int> v;
    int len;
    while (1){
        if(cin>>len){
            len*=10000000;
            int num,val;
            cin>>num;
            v.clear();
            for(int i=0;i<num;i++){
                cin>> val;
                v.push_back(val);   
            }
            sort(v.begin(),v.end());
            int l=0,r=v.size()-1,sum;
            bool finish=false;
            while(l<r){
                sum = v[l]+v[r];
                if(sum==len){
                    finish = true;
                    cout << "yes "<< v[l]<<" "<<v[r]<<'\n';
                    break;
                }
                else if(sum < len)  l++;
                else r--;
            }
            if(!finish)
                cout << "danger\n";
        }
        else break;
    }
    return 0;
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 1561] 놀이 공원 (C++)  (3) 2021.02.25
[백준 3745] 오름세 (C++)  (0) 2021.02.25
[백준 2586] 전깃줄 - 2 (C++)  (0) 2021.02.24
[백준 2473] 세 용액 (C++)  (0) 2021.02.24
[백준 1365] 꼬인 전깃줄 (C++)  (0) 2021.02.24
Comments