반응형
문제링크: https://www.acmicpc.net/problem/3649
일반적인 투포인터 문제
주의할 점은 "입력은 여러 개의 테스트 케이스로 이루어져 있다." 라는 말...
테스트케이스에서는 테스트가 반복되지않는 예시를 주는데, 입력을 여러번 받을 수 있도록 구현해야하는 문제.
while(cin>>a>>b)
위 처럼 작성함으로서 해당 문제는 해결
접근방식
1. 투 포인터를 가지고 값을 하나씩 조정해 보면서 결과를 도출한다.
2. " |ℓ1 - ℓ2|가 가장 큰 것 " 이라는 조건을 유념하면서
문제풀이
1. 배열을 정렬
2. 일반적인 투포인터 처럼 값을 하나씩 옮기면서 구현
3. |ℓ1 - ℓ2|가 가장 클려면 인덱스의 간격이 가장 클 때(정렬 상태에서) 이니까
결과값이 도출되면 바로 break!
구현자체 난이도는 상당히 쉬운 편이었습니다.
정답코드입니다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int x, n;
while (cin >> x >> n) {
x *= 10000000;
vector<int> vec;
int temp;
for (int i = 0; i < n; i++) {
cin >> temp;
vec.push_back(temp);
}
sort(vec.begin(), vec.end());
int low = 0, high = vec.size() - 1;
bool flag = false;
while (low < high) {
int sum = vec[low] + vec[high];
if (sum == x) {
flag = true;
break;
}
if (sum < x) { //low를 이동시켜줘야지..
low++;
}
else { //sum > x
high--;
}
}
if (flag)
cout << "yes " << vec[low] << ' ' << +vec[high] << endl;
else
cout << "danger" << endl;
}
return 0;
}
반응형