- 예제 입력1
5 21
5 6 7 8 9
- 예제 출력1
21
- 예제 입력2
10 500
93 181 245 214 315 36 185 138 216 295
- 예제 출력2
497
- 문제 접근
- 카드의 개수 N은 100개이하
- 시간 복잡도 O(N^3)으로 풀더라도 1000000이므로 0.01초로 시간 제한 문제 없음
- N개 중 3개를 합한 값이 M이하인 것중 최댓값을 구하는 문제
- 문제 해결
- N[0] + N[1] + N[2] ≤ M → max에 저장
- N[0] + N[1] + N[3] ≤ M → max와 비교하여 더 큰 값 max에 저장
- ...
- N[0] + N[1] + N[N.length-1] ≤ M → 더 큰 값 max에 저장
- 3중 반복문 사용
- i = 0 / i < N - 2
- j = i + 1 / j < N -1
- k = j + 1 / k < N
- 슈도 코드
N(카드 개수) 저장, M(목표 값) 저장
A(카드를 저장할 배열 선언)
for(0 ~ N-1개 반복){
배열에 카드 값 저장
}
max(최대값을 저장할 변수 선언)
for(i = 0 ~ N-3 반복){
for(j = i+1 ~ N-2 반복){
for(k = j+1 ~ N-1 반복){
tmp = N[i] + N[j] + N[k]
if(tmp <= M && tmp > max){
max = tmp
}
}
}
}
max 출력
- 코딩하기
public static void main(String[] args) throws Exception{
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[] A = new int[N];
st = new StringTokenizer(br.readLine());
for(int i = 0; i < N; i++){
A[i] = Integer.parseInt(st.nextToken());
}
int max = 0;
for(int i = 0; i < N-2; i++){
if(max == M) break; // max의 값이 M과 같다면 더 이상 비교의 핋요성이 없음
for(int j = i+1; j < N-1; j++){
for(int k = j+1; k < N; k++){
int tmp = A[i] + A[j] + A[k];
if(tmp <= M && tmp > max){
max = tmp;
}
}
}
}
System.out.println(max);
}
최댓값을 찾을 경우 break를 하게 되면 시간 복잡도가 최선의 경우 O(1)
'Coding Test > Step12. 브루스 포트' 카테고리의 다른 글
[Java] 6단계. 체스판 다시 칠하기 [2839번] (0) | 2024.07.14 |
---|---|
[Java] 5단계. 영화감속 숌 [1436번] (0) | 2024.07.14 |
[Java] 4단계. 체스판 다시 칠하기 [1018번] (0) | 2024.07.14 |
[Java] 3단계. 수학은 비대면 강의입니다. [19532번] (0) | 2024.07.14 |
[Java] 2단계. 분해합 [2231번] (0) | 2024.07.14 |