
난이도: ★★☆☆☆ • solved on: 2025-12-23

자료구조
int[] : 카드 값 저장알고리즘/기법
i < j < k)핵심 키워드
- 문제 분해
- 카드 3장을 뽑는 모든 경우의 수를 확인한다.
- 합이 M 이하인 경우만 후보가 된다.
- 그 중 가장 큰 합을
total에 저장한다.
핵심 로직 흐름
total = 0 for i in [0..n-1]: for j in [i+1..n-1]: for k in [j+1..n-1]: sum = cards[i] + cards[j] + cards[k] if sum <= m and sum > total: total = sum print(total)예외 처리
i < j < k로 인덱스를 제한해 중복 선택/같은 카드 2번 선택을 방지한다.- 문제 조건상 정답이 항상 존재하므로
total초기값은 0으로 충분하다.
import java.util.*;
import java.lang.*;
import java.io.*;
class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String[] s = sc.nextLine().split(" ");
int n = Integer.parseInt(s[0]);
int m = Integer.parseInt(s[1]);
String[] arr = sc.nextLine().split(" ");
int[] cards = new int[n];
for(int i = 0; i < n; i++){
cards[i] = Integer.parseInt(arr[i]);
}
int total = 0;
for(int i = 0; i < n; i++){
for(int j = i+1; j < n; j++){
for(int k = j+1; k < n; k++){
int sum = cards[i] + cards[j] + cards[k];
if(total < sum && sum <= m){
total = sum;
}
}
}
}
System.out.println(total);
}
}
시간 복잡도: O(N³)
공간 복잡도: O(N)
Queue로 hand를 컨트롤하려 했지만, 순차 제거 방식이라 다양한 조합을 놓칠 수 있었다.sum을 변수로 빼두면 조건식이 깔끔해지고 중복 계산이 줄어든다.BufferedReader + StringTokenizer로도 최적화 가능하지만, 이 문제는 Scanner로도 충분히 통과 가능하다.비슷한 유형 (GPT 추천) :
확장 문제 (GPT 추천) :