티스토리 뷰
문제 링크 : https://www.acmicpc.net/problem/31589
🍊해결방법
- 조합을 통해 K개를 구하게 되면 시초
- 문제의 조건 중 맨 처음 포도주는 온전히 맛으로 인정된다는게 중요!!
- 결국은 젤 큰 값을 먼저 마시면 된다
- 정렬을 활용하자
- 테스트 케이스를 보면
3 6 8 8 15
첫번째로 15를 먹고
두번째로 3을 먹을 때는 값이 작으므로 0
세번째로 8을 먹으면 차이인 5
즉 20이 나오게 된다 - 정렬을 활용해서 오른쪽 끝에서 한번 왼쪽끝에서 한번 이런식으로 먹어야 차이가 크므로 투포인터 활용
😀풀이
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 포도주를 K만큼 고른다
// 앞서 고른 포도주보다 값이 작으면 0
// 앞서 고른 포도주보다 값이 크면 차이만큼 느낌
// 맨처음 마시는것을 젤 큰 것부터 마시자
// 정렬이 필요
// 맨뒤와 맨앞 번갈아가면서 마시면 젤 큰 값
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
int[] arr = new int[N];
st = new StringTokenizer(br.readLine());
for(int i=0; i<N; i++){
arr[i] = Integer.parseInt(st.nextToken());
}
// 정렬을 통하여 구해보자
Arrays.sort(arr);
int left = 0;
int right = N-2;
long max = arr[N-1];
int cnt = 1;
if (K <= 2){
System.out.println(max);
return;
}
while(left < right){
// 작은쪽은 맛이 없으므로 0이된다
cnt++;
if (cnt == K) break;
// 큰쪽
max += (arr[right] - arr[left]);
cnt++;
if (cnt == K) break;
left++;
right--;
}
System.out.println(max);
}// end main
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 31801 증가와 감소 - 구현, 누적합 (1) | 2024.11.14 |
---|---|
[백준] 1744 수 묶기 - 그리디 (0) | 2024.11.14 |
[백준] 10422 괄호 - DP (0) | 2024.11.13 |
[백준] 1043 거짓말 - 유니온파인드 (0) | 2024.11.12 |
[백준] 9019 DSLR - BFS (0) | 2024.11.11 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- dp
- 조합
- 스프링부트3
- leetcode 1552
- dfs
- 위상정렬
- 투포인터
- 1482
- 백준
- BFS
- 스프링부트3 java 버전오류
- 이진탐색
- 백준 14890 경사로
- 스프링부트3 자바 버전
- 티스토리챌린지
- 유니온파인드
- 백준 14890 자바
- 스프링부트3 자바 17 오류
- 백준 경사로 자바
- 오블완
- 탑다운
- 구현
- 탑다운dp
- #스프링부트 자바버전 오류
- 바텀업
- 백준 14890
- 누적합
- 슬라이딩윈도우
- sql
- 백준 경사로
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
글 보관함