알고리즘 :: 큰돌 :: Chapter 5 - 투포인터 :: 백준 3273번 두 수의 합

Embedded June·2023년 8월 28일
0
post-thumbnail

문제

문제 링크

해설

  • 전형적인 투포인터 문제입니다.
  • 수열의 길이가 최대 10만이므로 O(N²)이 소요되는 bruteforce로는 풀 수 없습니다.
  • 우선, 수열을 오름차순으로 정렬합니다. (O(NlogN))
  • 수열에서 더할 두 값을 leftright이라는 포인터로 지정한 뒤
    • 더한 값이 X보다 크다면 right을 감소,
    • 더한 값이 X보다 작다면 left를 증가,
    • 더한 값이 X와 같다면 정답 경우의 수를 1개 카운팅합니다.
    • 이 과정을 rightleft가 서로 교차할 때까지 반복합니다.

코드

#include <bits/stdc++.h>
using namespace std;

int main() {
	cin.tie(0)->sync_with_stdio(0);
	
	int N;
	cin >> N;

	vector<int> v(N);
	for (int i = 0; i < N; ++i) cin >> v[i];
	
	int X;
	cin >> X;
	
	sort(begin(v), end(v));
	
	int ans = 0, left = 0, right = N - 1;
	while (right > left) {
		int sum = v[left] + v[right];
		if (sum > X) right--;
		else if (sum < X) left++;
		else ans++, left++, right--;
	}
}

소스코드 링크

결과

profile
임베디드 시스템 공학자를 지망하는 컴퓨터공학+전자공학 복수전공 학부생입니다. 타인의 피드백을 수용하고 숙고하고 대응하며 자극과 반응 사이의 간격을 늘리며 스스로 반응을 컨트롤 할 수 있는 주도적인 사람이 되는 것이 저의 20대의 목표입니다.

0개의 댓글