반응형

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

 

3649번: 로봇 프로젝트

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

www.acmicpc.net

 

일반적인 투포인터 문제

주의할 점은 "입력은 여러 개의 테스트 케이스로 이루어져 있다."  라는 말...

테스트케이스에서는 테스트가 반복되지않는 예시를 주는데, 입력을 여러번 받을 수 있도록 구현해야하는 문제.

 

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;
}

 

반응형

+ Recent posts