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에 저장합니다.
    • 이 과정을 통해 중간에 있는 한 개의 운동기구와 짝지어지지 않은 나머지 운동기구들 중 가장 큰 근손실 값을 찾습니다.

 

반응형