작성일 :

문제 링크

12604번 - Store Credit (Large)

설명

주어진 가격 목록에서 합이 크레딧이 되는 두 물건의 위치를 찾는 문제입니다.


접근법

먼저 가격과 인덱스를 함께 저장해 정렬합니다.

다음으로 양 끝 포인터를 움직이며 합이 크레딧이 되는 쌍을 찾습니다.

마지막으로 원래 인덱스를 작은 값부터 출력합니다.



Code

C#

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using System;
using System.Text;

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

    for (var caseNum = 1; caseNum <= t; caseNum++) {
      var c = int.Parse(parts[idx++]);
      var n = int.Parse(parts[idx++]);
      var arr = new int[n][];
      for (var i = 0; i < n; i++)
        arr[i] = new int[] { int.Parse(parts[idx++]), i + 1 };

      Array.Sort(arr, (x, y) => x[0].CompareTo(y[0]));

      var l = 0;
      var r = n - 1;
      var a = 0;
      var b = 0;
      while (l < r) {
        var sum = arr[l][0] + arr[r][0];
        if (sum == c) {
          a = arr[l][1];
          b = arr[r][1];
          break;
        }
        if (sum < c) l++;
        else r--;
      }

      if (a > b) {
        var tmp = a;
        a = b;
        b = tmp;
      }
      sb.AppendLine($"Case #{caseNum}: {a} {b}");
    }

    Console.Write(sb);
  }
}

C++

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <bits/stdc++.h>
using namespace std;
typedef vector<int> vi;
typedef pair<int, int> pii;

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

  int t; cin >> t;

  for (int caseNum = 1; caseNum <= t; caseNum++) {
    int c, n; cin >> c >> n;

    vector<pii> arr(n);
    for (int i = 0; i < n; i++) {
      int v;
      cin >> v;
      arr[i] = {v, i + 1};
    }

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

    int l = 0;
    int r = n - 1;
    int a = 0;
    int b = 0;
    while (l < r) {
      int sum = arr[l].first + arr[r].first;
      if (sum == c) {
        a = arr[l].second;
        b = arr[r].second;
        break;
      }
      if (sum < c) l++;
      else r--;
    }

    if (a > b) {
      int tmp = a;
      a = b;
      b = tmp;
    }
    cout << "Case #" << caseNum << ": " << a << " " << b << "\n";
  }

  return 0;
}