본문 바로가기

백준/C++

[C++] 백준 2470번 - 두 용액

728x90

 

... 드디어 돌아왔다.

약 2주전... 난 해외여행을 갔다 왔다.

 

우리나라와는 멀리 떨어진 나라여서 그런지 엄청 피곤하다...

너무 졸려서 눈이 저절로 감겼다.

역시... 여행도 체력이 필요한 것 같다.

 

그렇게 집으로 돌아와서 충전을 하다가...

뭔가 잊어버린 느낌이 들기 시작했다.

 

 

 

 

 

 

 

 

그렇다!!!

 

나에게는 해외에 가기 전, 하고 있던 스터디가 있었던 것이었다.

약 14시간 동안 비행기를 타고 돌아오니 그 사실을 까맣게 잊어버렸다...

그래서 스터디 인증 올리는 곳에 들어가 보니 나를 환영해 주는 글까지 있었다(감동).

얼른 써야지! 오늘 다시 복귀할 것이다 ㅎㅎ.

 

 

 

이제 다시 C++ 공부하다가 다음 공부로 넘어가야겠다.

그럼 스타트~~~

 

 

 

문제 2470번

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

 

2470번: 두 용액

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

www.acmicpc.net

 

오랜만에 하니까 좀 새로운 느낌이 든다...

다시 익숙해져야지.

 

이 문제는 보니까 예전에 했던 투포인터를 사용해야 될 것 같다.

 

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

int n,k;
vector<int> result(2);
int main() {
	cin >> n;
	vector<int> num(n);
	for (int i = 0; i < n; i++) {
		cin >> num[i];
	}
	sort(num.begin(), num.end());
	int start = 0;
	int end = n-1;
	int min = 2000000000;
	int sum = 0;
	while (start < end) {
		sum = num[start] + num[end];
		
		if (min > abs(sum)) {
			min = abs(sum);
			result[0] = num[start];
			result[1] = num[end];
			if (sum == 0) {
				break;
			}
		}
		if (sum < 0) {
			start++;
		}
		else {
			end--;
		}
	}
	cout << result[0] << ' ' << result[1];
	return 0;
}

 

 

중간에 기억이 안 나서 모르는 부분은 다른 분의 블로그를 참고해서 작성했다.
[참고] https://ansohxxn.github.io/boj/2470/

 

 

 

일단 용액들을 입력받은 후에 이를 정렬해 주었다. 투포인터를 사용하기 위해서는 정렬이 필수이다!!

그리고 start, end라는 포인터를 만들고 각각 맨 앞, 맨 뒤의 인덱스를 넣어준다.

여기서 min은 문제에서 나온 특성값이 0에 가장 가까운 값이다. 나올 수 있는 값 중 가장 큰 값이 나와야 하기 때문에 가장 큰 특성값 1,000,000,000를 2번 더한 값으로 하면 된다.

그리고 while문을 이용하여 값을 찾아준다. 해당 포인터가 가리키는 값을 더하였을 때 그 절댓값이 min보다 작으면 min에 넣어준다. result에는 해당되는 두 용액을 넣어주면 된다. 만약 sum값이 0이면 가장 0에 가까운 것에 해당하기 때문에 break로 반복문을 빠져나와준다(해당 위치에 이러한 조건문을 적은 이유는 따로 적는다면 해당 용액이 무엇인지 중복하여 작성해야 하기 때문). 절댓값을 사용하는 이유는 가장 0과 가까운 값을 찾아야 하기 때문이다.

만약 sum이 0보다 작으면 좀 더 sum이 커져야 하므로 start에 1을 더해줘 sum의 값을 크게 만든다.

반대로 0보다 크면 sum이 작아져야 하므로 end에 1을 빼줘 sum의 값을 작게 만든다.

 

그렇게 나온 두 용액을 마지막에 출력해 주면 된다.

 

 

 

 

오랜만에 코드를 작성하니까 재밌는 것 같기도 하고...?? ㅎㅎ

이제 다시 부지런히 공부해야지~~

 

너무 피곤해서 이만 자야겠다...

모두들 굿나잇~~

 

728x90

'백준 > C++' 카테고리의 다른 글

[C++] 백준 1300번 - K번째 수  (0) 2024.03.04
[C++] 백준 1337번 - 올바른 배열  (0) 2024.03.01
[C++] 백준 2822번 점수 계산  (6) 2023.12.27
[C++] 백준 5800번 성적 통계  (4) 2023.12.26
[C++] 백준 14729번 칠무해  (2) 2023.12.25