블랙잭

05 July 2019

문제 : https://www.acmicpc.net/problem/2798

이번은 카드를 고르는 모든 경우를 고려하는 문제를 풀어보도록 하겠습니다.

import java.util.Scanner;

public class Main {

    private static int[] arr;

    public static void main(String args[]) {

        Scanner sc = new Scanner(System.in);

        int size = sc.nextInt();
        int targetNum = sc.nextInt();

        arr = new int[size];

        for (int i = 0; i < size; i++) {
            arr[i] = sc.nextInt();
        }

        int maxNum = getMaxNum(size, targetNum);

        System.out.println(maxNum);
    }

    private static int getMaxNum(int size, int targetNum) {
        int maxNum = 0;
        for (int i = 0; i < size; i++) {
            for (int k = i + 1; k < size; k++) {
                for (int m = k + 1; m < size; m++) {
                    int val = arr[i] + arr[k] + arr[m];

                    if (val == targetNum) {
                        return val;
                    } else if (val < targetNum && val > maxNum) {
                        maxNum = val;
                    }
                }
            }
        }
        return maxNum;
    }
}
이번은 모든 수를 대입하는 방식인 브루트포스를 이용해 문제를 풀어보도록 하겠습니다.
주어진 값들 중에서 3개를 뽑는 모든 방식이므로, for문을 세개를 겹쳐서 풀이가 가능합니다.
가장 처음 수부터, 그 다음 수는 처음 수의 다음번째 수, 그 다음 수는 그 다음번째의 다음번째 수부터 시작하여 마지막까지 조회를 하도록 합니다.
중간에 targetNum와 같은 수가 나오게 되면 멈추고, 조회 중에는 targetNum보다 작고, 현재 max인 값보다 큰 경우를 저장해서 이어갑니다.