Algorithm/Java
[백준/JAVA] 20300번: 서강근육맨
dbfl9911
2024. 7. 17. 10:12
반응형
https://www.acmicpc.net/problem/20300
- 정답 코드
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
long[] list = new long[N];
for(int i = 0; i < N; i++) {
list[i] = sc.nextLong();
}
Arrays.sort(list); // [1,2,3,4,5]
// 1 4 선택 / 2 3 선택 / 5 선택
long M = 0;
if(N % 2 == 0) {
// 첫 번째와 마지막, 두 번째와 끝에서 두 번째 식으로 짝지어 최대 근손실 값을 계산
for(int i = 0; i < N / 2; i++) {
// 현재 짝의 근손실 합과 M을 비교하여 큰 값을 M에 저장
M = Math.max(M, list[i] + list[N - 1 - i]);
}
}else{
// 중앙에 있는 한 개의 운동기구를 미리 M에 할당
M = list[N - 1];
// 첫 번째와 끝에서 두 번째, 두 번째와 끝에서 세 번째 식으로 짝지어 최대 근손실 값을 계산
for(int i = 0; i < (N - 1) / 2; i++) {
M = Math.max(M, list[i] + list[N - 2 - i]);
}
}
System.out.println(M);
}
}
- 문제 풀이
입력 값의 제한 조건에서 t_i가 최대 10^18까지 가능하다고 했기 때문에 long을 사용
1. 운동기구의 개수가 짝수인 경우
if(N % 2 == 0) {
for(int i = 0; i < N / 2; i++) {
M = Math.max(M, list[i] + list[N - 1 - i]);
}
}
- for(int i = 0; i < N / 2; i++):
- 배열의 절반(N / 2)만큼 반복합니다. 짝수인 경우, 전체 배열을 절반으로 나눠 첫 번째부터 중간까지의 인덱스와 마지막부터 중간까지의 인덱스를 짝지을 수 있습니다.
- M = Math.max(M, list[i] + list[N - 1 - i]):
- list[i]와 list[N - 1 - i]의 합을 계산하여 현재 최대값인 M과 비교합니다.
- Math.max를 사용하여 두 값 중 큰 값을 M에 저장합니다.
- 이 과정을 통해 가장 큰 근손실 값을 찾습니다.
2. 운동기구의 개수가 홀수인 경우
}else{
// 중앙에 있는 한 개의 운동기구를 미리 M에 할당
M = list[N - 1]; // list[5 - 1] = list[4]
for(int i = 0; i < (N - 1) / 2; i++) { // i = 0 ~ 1
M = Math.max(M, list[i] + list[N - 2 - i]); // list[0] + list[3] = 1 + 4 = 5 = M
// list[1] + list[2] = 2 + 3 = 5 = M
}
}
- M = list[N - 1]:
- 배열의 마지막 요소( list [N - 1])를 M 에 할당합니다.
- 이 값은 배열이 홀수일 때 중간에 있는 한 개의 운동기구를 의미합니다.
- for(int i = 0; i < ( N - 1) / 2; i++):
- 배열의 절반(( N - 1) / 2)만큼 반복합니다. 홀수인 경우, 중간에 있는 한 개의 운동기구를 제외하고 나머지 운동기구들을 짝지어야 합니다.
- M = Math.max( M , list [i] + list [N - 2 - i]):
- list [i]와 list [N - 2 - i]의 합을 계산하여 현재 최대값인 M과 비교합니다.
- Math.max를 사용하여 두 값 중 큰 값을 M에 저장합니다.
- 이 과정을 통해 중간에 있는 한 개의 운동기구와 짝지어지지 않은 나머지 운동기구들 중 가장 큰 근손실 값을 찾습니다.
반응형