작성일 :

문제 링크

15234번 - Number Pairs

설명

서로 다른 정수들이 주어질 때 합이 K가 되는 두 수의 쌍 개수를 구하는 문제입니다.


접근법

먼저 수를 하나씩 보면서 이전에 나온 수 중에서 목표 합이 되는 짝이 있는지 확인합니다.

다음으로 짝이 있으면 개수를 늘리고, 현재 수를 집합에 기록합니다.

이후 모든 수를 처리하면 각 쌍은 한 번만 세어집니다.

마지막으로 총 개수를 출력합니다.



Code

C#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using System.Collections.Generic;

class Program {
  static void Main() {
    var parts = Console.In.ReadToEnd().Split();
    var idx = 0;
    var n = int.Parse(parts[idx++]);
    var k = int.Parse(parts[idx++]);

    var seen = new HashSet<int>();
    var cnt = 0;
    for (var i = 0; i < n; i++) {
      var v = int.Parse(parts[idx++]);
      if (seen.Contains(k - v)) cnt++;
      seen.Add(v);
    }

    Console.WriteLine(cnt);
  }
}

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <bits/stdc++.h>
using namespace std;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int n, k;
  if (!(cin >> n >> k)) return 0;

  unordered_set<int> seen;
  int cnt = 0;
  for (int i = 0; i < n; i++) {
    int v; cin >> v;
    if (seen.find(k - v) != seen.end()) cnt++;
    seen.insert(v);
  }

  cout << cnt << "\n";
  return 0;
}