[백준 12604] Store Credit (Large) (C#, C++) - soo:bak
작성일 :
문제 링크
설명
주어진 가격 목록에서 합이 크레딧이 되는 두 물건의 위치를 찾는 문제입니다.
접근법
먼저 가격과 인덱스를 함께 저장해 정렬합니다.
다음으로 양 끝 포인터를 움직이며 합이 크레딧이 되는 쌍을 찾습니다.
마지막으로 원래 인덱스를 작은 값부터 출력합니다.
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;
}