import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Test2798 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int[] arr = new int[N];
st = new StringTokenizer(br.readLine(), " ");
// 배열에 숫자들을 넣어준다.
for(int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
//M에 가까운 숫자 조합 가져오기
int result = getLargeNumCombinations(arr, N, M);
System.out.print(result);
}
private static int getLargeNumCombinations(int[] arr, int N, int M) {
// 결과
int result = 0;
for(int i = 0; i < N - 2; i++) {
if(arr[i] > M) continue;
for(int j = i + 1; j < N - 1; j++) {
if(arr[i] + arr[j] > M) continue;
for(int k = j + 1; k < N; k++) {
int sum = arr[i] + arr[j] + arr[k];
if(sum == M) {
result = sum;
return result;
}
if(result < sum && sum < M) {
result = sum;
}
}
}
}
return result;
}
}
브루트 포스라는 카테고리의 문제 중 하나이다.
브루트 포스란 '난폭한' 이란 뜻으로 어떠한 값을 찾아내기 위해
이것저것 대입해보는 방법을 말한다고 한다.
처음에는 효율적?으로 문제를 푸는데 집중을 하였다.
아래는 처음 풀었던 코드이다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Collections;
import java.util.StringTokenizer;
public class Main {
static Integer[] arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
arr = new Integer[N];
st = new StringTokenizer(br.readLine(), " ");
// 배열에 숫자들을 넣어준다.
for(int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
//큰 숫자 순으로 정렬
Arrays.sort(arr, Collections.reverseOrder());
//M에 가까운 숫자 조합 가져오기
int result = getLargeNumCombinations(M);
System.out.print(result);
}
private static int getLargeNumCombinations(int max) {
// 결과
int result = 0;
//제일 큰 두 값
int most1;
int most2;
for(int j = 0; j < arr.length - 1; j++) {
// 처음엔 제일 큰 두값이 0, 1 인덱스 지만,
// 만약 큰 값을 발견하지 못하고 한 싸이클을 다시 돌게되면
// 1씩 더해준다.
most1 = arr[j];
most2 = arr[j + 1];
for(int i = j + 2; i < arr.length; i++) {
// 셋이 합친값
int sum = most1 + most2 + arr[i];
//같거나 작으면 result return
if(sum <= max) {
result = sum;
return result;
}
}
}
return result;
}
}