티스토리 뷰

반응형

✏️ 문제 링크

https://www.acmicpc.net/problem/2470

 

2470번: 두 용액

첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,00

www.acmicpc.net

 

✏️ 문제 설명

✏️ 문제 풀이

입력 받은 배열을 정렬한 후 투 포인터로 탐색하는 문제이고 몇 가지 경우의 수로 나눠서 접근해야 합니다.

1. 입력받은 용액값이 모두 음수일 때 => 0에서 가장 가까운 최댓값 2개 출력

2. 입력받은 용액값이 모두 양수일 때 => 0에서 가장 가까운 최솟값 2개 출력

3. 그 이외의 경우 => 투 포인터로 탐색하기

 

✏️ 문제 코드

#include<iostream>
#include<vector>
#include<algorithm>

int idx1;
int idx2;
long Min = 2000000000;

using namespace std;
int main() {

	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int N;
	cin >> N;

	vector<long>A(N, 0);
	for (int i = 0; i < N; i++)
		cin >> A[i];

	sort(A.begin(), A.end());
	if (A[0] >= 0) {
		cout << A[0] << " " << A[1];
		return 0;
	}
	if (A[N - 1] < 0) {
		cout << A[N - 2] << " " << A[N - 1];
		return 0;
	}
		int i = 0;
		int j = N - 1;
		while (i <= j) {
			if (A[i] + A[j] == 0) {
				idx1 = i;
				idx2 = j;
				break;
			}
			else if (A[i] + A[j] > 0) {
				if (A[i] + A[j] < Min) {
					Min = A[i] + A[j];
					idx1 = i;
					idx2 = j;
				}
				j--;
			}
			else if (A[i] + A[j] < 0) {
				if (abs(A[i] + A[j]) < Min) {
					Min = abs(A[i] + A[j]);
					idx1 = i;
					idx2 = j;
				}
				i++;
			}
			if (i == j)
				j--;
		}
		cout << A[idx1] << " " << A[idx2];
	}

 

 

✏️ 문제 링크

 

https://www.acmicpc.net/problem/2467

 

2467번: 용액

첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 오름차순으로 입력되며, 이 수들은 모두 -

www.acmicpc.net

 

✏️ 문제 설명

 

✏️ 문제 코드

#include<iostream>
#include<vector>
#include<algorithm>

int idx1;
int idx2;
long Min = 2000000000;

using namespace std;
int main() {

	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int N;
	cin >> N;

	vector<long>A(N, 0);
	for (int i = 0; i < N; i++)
		cin >> A[i];

	sort(A.begin(), A.end());
	if (A[0] >= 0) {
		cout << A[0] << " " << A[1];
		return 0;
	}
	if (A[N - 1] < 0) {
		cout << A[N - 2] << " " << A[N - 1];
		return 0;
	}
		int i = 0;
		int j = N - 1;
		while (i <= j) {
			if (A[i] + A[j] == 0) {
				idx1 = i;
				idx2 = j;
				break;
			}
			else if (A[i] + A[j] > 0) {
				if (A[i] + A[j] < Min) {
					Min = A[i] + A[j];
					idx1 = i;
					idx2 = j;
				}
				j--;
			}
			else if (A[i] + A[j] < 0) {
				if (abs(A[i] + A[j]) < Min) {
					Min = abs(A[i] + A[j]);
					idx1 = i;
					idx2 = j;
				}
				i++;
			}
			if (i == j)
				j--;
		}
		cout << A[idx1] << " " << A[idx2];
	}

 

 

✏️ 참고하기

 

https://pooreumjung.tistory.com/270

 

Algorithm 공부 #03 - 자료구조(투 포인터와 슬라이딩 윈도우)

Algorithm 공부 #03 - 자료구조(투 포인터와 슬라이딩 윈도우) 투 포인터 ● 2개의 포인터로 알고리즘의 시간 복잡도를 최적화함 백준2018번 연속된 수들의 합 https://www.acmicpc.net/problem/2018 2018번: 수들

pooreumjung.tistory.com

 

반응형

'Algorithm > BOJ' 카테고리의 다른 글

[C/C++] 백준 - 수열과 쿼리 문제  (0) 2024.03.30
[C/C++] 백준 - 세그먼트 트리 문제  (0) 2024.03.30
[C/C++] 백준 1517번 - 버블 소트  (0) 2024.03.02
[C/C++] 백준 28278번  (0) 2024.03.02
[C/C++] 백준 11399번 - ATM  (0) 2024.03.02
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함