1 분 소요

문제 링크

풀이 과정

처음 문제를 봤을 때는 어떻게 답을 구하지? 고민했다.

혹시 내가 모르는 방법이 있나 싶어서 이번 문제의 주제인 브루트 포스에 대해 검색해봤다.

정의는 간단했다.

조합 가능한 모든 문자열을 하나씩 대입해 보는 방식으로 암호를 해독하는 방법

이 개념을 알고나니 어떻게 접근해야할지 길이 보였다. 모든 경우의 수를 전부 해보면 된다는 것이다.

답은 간단했다. 주어진 N개의 카드 중 아무 3장의 모든 조합을 계산해보는 것이다. 그리고 M넘지 않으면서 가장 근접한 숫자를 찾으면 되는 문제였다.

풀이 순서는 다음과 같다.

  1. N과 M의 값을 입력받아 저장한다.
  2. N개의 카드에 적힌 숫자를 int배열에 저장한다.
  3. 가장 M 근접한 3카드 숫자의 합를 나타내는 closest 변수를 선언한다.
  4. 3중 for문을 통해 모든 3가지 조합을 계산해본다. 1 2 3 4의 카드가 있다하면 123, 124, 134, 234 의 순서로 계산을 하는 것이다.

전체 코드

class Program
{
    static void Main(string[] args)
    {
        string[] s = Console.ReadLine().Split(' ');

        int N = int.Parse(s[0]);
        int M = int.Parse(s[1]);

        s = Console.ReadLine().Split(' ');
        int[] cards = new int[N];

        for (int i = 0; i < N; i++)
        {
            cards[i] = int.Parse(s[i]);
        }

        int closest = 0;


        for (int i = 0; i < N - 2; i++)
        {
            for (int j = i + 1; j < N - 1; j++)
            {
                for (int k = j + 1; k < N; k++)
                {
                    int num = cards[i] + cards[j] + cards[k];
                    if(num <= M && num > closest)
                    {
                        closest = num;
                    }
                }
            }
        }

        Console.WriteLine(closest);

    }
}

댓글남기기