-
[백준/JAVA] 20300번: 서강근육맨Algorithm 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에 저장합니다.
- 이 과정을 통해 중간에 있는 한 개의 운동기구와 짝지어지지 않은 나머지 운동기구들 중 가장 큰 근손실 값을 찾습니다.
'Algorithm' 카테고리의 다른 글
[백준/JAVA] 13305번: 블로그2 (0) 2024.07.17 [백준/JAVA] 13305번: 주유소 (0) 2024.07.17 [백준/JAVA] 11399번: ATM (0) 2024.07.17 [백준/JAVA] 11508번: 2+1 세일 (0) 2024.07.16 [백준/JAVA] 1758번: 알바생 강호 (0) 2024.07.16 - for(int i = 0; i < N / 2; i++):