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


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]);

    }

}