ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준/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
Designed by Tistory.