배열 쓰니까 내 코드가 개판인 것도 있는데 조금만 잘못하면 인덱스 넘어가고, 메모리 넘치고 그러네. 리스트나 다른 자료구조를 쓸까.


using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main(string[] args)
{
string input = Console.ReadLine();
string[] nums = input.Split();
//입력
//첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과
//M(10 ≤ M ≤ 300,000)이 주어진다.
//둘째 줄에는 카드에 쓰여 있는 수가 주어지며,
//이 값은 100,000을 넘지 않는 양의 정수이다.
//합이 M을 넘지 않는 카드 3장을 찾을 수 있는 경우만
//입력으로 주어진다.
//출력
//첫째 줄에 M을 넘지 않으면서
//M에 최대한 가까운 카드 3장의 합을 출력한다.
//예제 입력
//10 500
//93 181 245 214 315 36 185 138 216 295
//예제 출력
//497
//N은 카드 총 개수
//M은 N개 카드 중 3개를 뽑을 때 넘지 않아야 할 값.
int N = int.Parse(nums[0]);
int M = int.Parse(nums[1]);
string input2 = Console.ReadLine();
string[] nums2 = input2.Split(' ');
int[] sum_3element = new int[1000000];
int[] less_than_3sum = new int[1000000];
int[] ary = new int[N];
//N개의 카드에 값들을 할당.
for (int i = 0; i < N; i++)
{
ary[i] = int.Parse(nums2[i]);
}
int cnt = 0;
Array.Sort(ary);
//sum_3element 배열에 카드 3개의 합들을 저장.
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
for (int k = 0; k < N; k++)
{
if (i != j && i != k && j != k)
{
sum_3element[cnt] = ary[i] + ary[j] + ary[k];
cnt++;
}
}
}
}
// 중복된 값을 제거하여 seted 배열에 할당.
HashSet<int> set = new HashSet<int>(sum_3element);
int[] seted = set.ToArray();
Array.Sort(seted);
// less_than_3sum 배열에
// 설정한 M이하의 값들 중
// M에 가장 근접한 값(3수의 합)을 할당
for (int i = 0; i < seted.Length; i++)
{
if (seted[i] <= M)
{
less_than_3sum[i] = seted[i];
}
else
{
break;
}
}
// M에 가장 근접한 값(3수의 합) 출력
Array.Sort(less_than_3sum);
Array.Reverse(less_than_3sum);
Console.WriteLine(less_than_3sum[0]);
}
}