https://www.acmicpc.net/problem/20300
20300번: 서강근육맨
PT 첫째 날에 $1$과 $4$를 선택하고, 둘째 날에 $2$와 $3$을 선택하고, 마지막 날에 $5$를 선택하면 $M$은 $5$가 되며, 이때가 $M$이 최소일 때이다.
www.acmicpc.net
코드설명
그리디 문제입니다.
문제예시로
5
1 2 3 4 5 가 있다고 가정합니다.
근손실 최소값을 구하기 위해서는 가장 큰 숫자와 가장 작은 숫자의 합이 최소값일 것입니다.
그러기 위해서 오름차순 정렬을 하면, 첫번째 숫자와 끝자리 숫자와의 합이 최소값입니다.
N이 짝수라면, 가장 큰 숫자도 같이 짝을 이루고,
N이 홀수라면, 마지막 숫자는 짝을 이루지 않습니다.
둘째 줄에는 각 운동기구의 근손실 정도를 나타내는 정수 T의 범위가 0 <= t <= 10^18 이기에 Long type을 활용해야합니다.
코드
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; public class Main { public static int N; public static long[] arr; public static long result = 0; public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); arr = new long[N]; st = new StringTokenizer(br.readLine()); for(int i=0;i<N;i++) { arr[i] = Long.parseLong(st.nextToken()); } Arrays.sort(arr); result = arr[N-1]; long a = 0; long b = 0; if(N == 1) { System.out.println("1"); return ; } for(int i=0;i<N/2;i++) { a = arr[i]; if(N%2 == 0) { b = arr[N-1-i]; }else if(N%2==1) { b = arr[N-1-1-i]; } result = Math.max(result, a + b); } System.out.println(result); } }
더 직관적인 코드입니다.
홀수라면, 가장 큰값은 혼자 운동하도록 처리합니다.
package Main; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.StringTokenizer; import java.util.TreeMap; public class Main { private static int N, M, Q, K; private static long[] arr; private static int answer = 0; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); arr = new long[N]; st = new StringTokenizer(br.readLine()); for(int i=0;i<N;i++) { arr[i] = Long.parseLong(st.nextToken()); } Arrays.sort(arr); int left = 0, right = N-1; long sum = 0; if(left == 0 && right == 0) { sum= arr[0]; System.out.println(sum); return ; } if(N%2 == 1) { sum = Math.max(sum, arr[N-1]); right -= 1; } while(left < right) { sum = Math.max(sum, arr[left] + arr[right]); left++; right--; } System.out.println(sum); } }
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 16953 A → B - DFS(깊이우선탐색) JAVA (0) | 2023.07.21 |
---|---|
[백준] 20365 블로그2 - 그리디 + StringTokenizer JAVA (0) | 2023.07.21 |
[백준] 20115 에너지 드링크 - 그리디(탐욕법, Greedy) JAVA (0) | 2023.07.21 |
[백준] 11508 2+1 세일 - 그리디 + 정렬 JAVA (0) | 2023.07.21 |
[백준] 1758 알바생 강호 - 그리디 + 정렬 JAVA (0) | 2023.07.20 |