[백준 2470] 두 용액

Date:     Updated:

카테고리:

태그:

난이도

골드 V

📜문제

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

image

틀린 풀이 ❌

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

using namespace std;

int main()
{
	int N = 0;
	cin >> N;

	vector<int> v(N);
	for (int i = 0; i < N; i++)
	{
		cin >> v[i];
	}

	sort(v.begin(), v.end());

	int start = 0, end = v.size() - 1;
	int min = 2000000000;
	vector<int> result(2);

	while (start < end)
	{
		if (v[start] + v[end] < 0)
		{
			if (abs(v[start] + v[end]) < min)
			{
				min = abs(v[start] + v[end]);
				result[0] = v[start];
				result[1] = v[end];
			}
			start++;
		}
		else if (v[start] + v[end] > 0)
		{
			if ((v[start] + v[end]) < min)
			{
				min = v[start] + v[end];
				result[0] = v[start];
				result[1] = v[end];
			}
			end--;
		}
		else break;
	}


	cout << result[0] << " " << result[1] << "\n";
	return 0;
}

v[start] + v[end] 가 0일 경우 break한다고 생각했는데 이렇게 됐을 때 result의 값이 최신화가 안된다는 것을 인지하지 못했다.

맞은 풀이 ⭕

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

using namespace std;

int main()
{
	int N = 0;
	cin >> N;

	vector<int> v(N);
	for (int i = 0; i < N; i++)
	{
		cin >> v[i];
	}

	sort(v.begin(), v.end());

	int start = 0, end = v.size() - 1;
	int min = 2000000000; // input으로 나올 수 없는 최대값 설정
	vector<int> result(2);

	while (start < end)
	{
		if (abs(v[start] + v[end]) < min) // 절대값이 min 보다 작을 경우
		{
			min = abs(v[start] + v[end]);
			result[0] = v[start];
			result[1] = v[end];

			if (v[start] + v[end] == 0) break;
		}

		if (v[start] + v[end] < 0) start++;
		else if (v[start] + v[end] > 0) end--;
	}

	cout << result[0] << " " << result[1] << "\n";
	return 0;
}

틀린 풀이에서 나눈 if문에서 모두 result의 최신화가 일어나서 하나의 코드로 묶어주고 계산했다.

맨 위로 이동하기

BOJ 카테고리 내 다른 글 보러가기

댓글남기기