JAVA/Coding Test

[JAVA] 백준 2798 블랙잭_브루트포스

오늘도개발 2023. 2. 28. 16:50

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

 

2798번: 블랙잭

첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다. 합이 M을 넘지 않는 카드 3장

www.acmicpc.net

 

접근 :

 

- 입력 받은 N 개의 수 중 3개를 골라 합하여 target number(M)를 넘지 않는 가장 근접한 수를 출력

 

- N이 3으로 고정되어 있으므로 재귀 함수 대신 반복문으로 구현

 

- N개중 1개를 뽑았을 때, M과 같거나 큰 경우 제외(다음 수 로 넘어감)

 

- N개중 2개를 뽑았을 때, M과 같거나 큰 경우 제외(다음 수 로 넘어감)

 

- N개중 3개를 다 뽑은 경우, M보다 작은 경우 가장 M과 근접한 수를 찾아서 결과로 출력

 

- N개중 3개를 다 뽑은 경우, M과 같은 경우 더이상 진행하지 않고 M을 결과로 출력

 

import java.io.*;

public class Main {

	public static void main(String[] args) throws IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		// 1 번째 줄
		String[] inputs = br.readLine().split(" ");
		int n = Integer.parseInt(inputs[0]);
		int target_num = Integer.parseInt(inputs[1]);

		// 2 번째 줄
		inputs = br.readLine().split(" ");
		int[] numbers = new int[n];
		for (int i = 0; i < n; i++) numbers[i] = Integer.parseInt(inputs[i]);

		int result = 0;
		int temp_sum = 0;
		int temp_result = 0;

		main_Loop :for (int j = 0; j < n - 2; j++) {

			// 뽑은 수가 목표치 보다 크거나 같으면 다음 수로 넘어감
			if (numbers[j] >= target_num) continue;

			for (int k = j + 1; k < n - 1; k++) {
				
				temp_sum = numbers[j] + numbers[k];
				if (temp_sum >= target_num) continue;

				for (int p = k + 1; p < n; p++) {
					
					temp_result = temp_sum + numbers[p];
					
					// 목표치 보다 작은 값 중 가장 target에 근접한 수를 결과값으로 선정
					if (temp_result < target_num) {
						result = (temp_result > result) ? temp_result : result;
						
					// 목표치와 동일한 값을 발견하면 더 이상 진행하지 않고 결과 출력 
					}else if(temp_result == target_num) {
						result = target_num;
						break main_Loop;
					}
				}
			}
		}

		// 결과 화면출력
		System.out.println(result);
		br.close();
	}
}