티스토리 뷰

1. 문제

https://www.acmicpc.net/problem/20300

 

20300번: 서강근육맨

PT 첫째 날에 $1$과 $4$를 선택하고, 둘째 날에 $2$와 $3$을 선택하고, 마지막 날에 $5$를 선택하면 $M$은 $5$가 되며, 이때가 $M$이 최소일 때이다.

www.acmicpc.net


 

2. 문제 이해

숫자를 2개씩 짝 지어서(운동기구 별 근손실 값) 최대로 큰 값중 최소값 

이해해보면

1 2 3 4 5  
1+2 = 3 / 3+4 = 7 /5 잖아 그럼 근손실이 가장 큰 값이 7
1+3 = 4 / 2+4 = 6 / 5 이러면 근손실이 가장 큰 값이 6
1+4 = 5 / 2+3 = 5 / 5 이러면 근손실이 가장 큰 값이 5

그럼 근손실 M 은 5가 답 

즉, 근손실중 큰 값에서 최소로 만들 수 있는 근손실을 구하는 것

 

3. 풀이 방법

1. 나는 짝수 일 경우, 홀수 경우 나눠서 판단해줬다.

2. 근손실 값들 입력받고 정렬을 해줬다.

   그 이유는 첫번째는 무조건 작아야하고, 마지막 수랑 짝지어주기 위해서 해줬다.  

  어떤 경우의 수도 제일 최대값에 제일 최소값을 더해주면 나올 수 있는 경우 중 제일 작기 때문이다!

3. 짝수일 경우 -> arr[0] + arr[N-1]  arr[1] + arr[N-2] ... 이렇게 진행

4. 홀수일 경우 -> 맨 마지막 수를 max 값을 두고, 이제 짝수 방식과 똑같이 0번째와  맨 마지막수의 전수 더해서 비교해줘서 제일 큰 값 구해주기!!!!

 

 

4. 코드

package net.acmicpc.solution;

import java.util.*;
import java.io.*;

public class Solution_20300_서강근육맨 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		long[] arr = new long[N];
		StringTokenizer st = new StringTokenizer(br.readLine());
		for (int i = 0; i < N; i++) {

			arr[i] = Long.parseLong(st.nextToken());
		}

		Arrays.sort(arr);

		long max = Long.MIN_VALUE;

		if (arr.length % 2 == 0) { // 짝수 일경우

			for (int i = 0; i < (N / 2) + 1; i++) {
				long sum = arr[i] + arr[N - i - 1];
				max = Math.max(sum, max);

			}
		} else {
			max = arr[N - 1];
			for (int i = 0; i < (N / 2) + 1; i++) {

				long sum = arr[i] + arr[N - i - 2];
				max = Math.max(sum, max);
			}

		}
		System.out.println(max);

	}
}

 

 

 

피드백은 언제나 환영입니다 :) 🌳

댓글