백준 13164 [자바] java 행복 유치원
문제 링크: https://www.acmicpc.net/problem/13164
13164번: 행복 유치원
입력의 첫 줄에는 유치원에 있는 원생의 수를 나타내는 자연수 N(1 ≤ N ≤ 300,000)과 나누려고 하는 조의 개수를 나타내는 자연수 K(1 ≤ K ≤ N)가 공백으로 구분되어 주어진다. 다음 줄에는 원생들
www.acmicpc.net
▶문제
행복 유치원 원장인 태양이는 어느 날 N명의 원생들을 키 순서대로 일렬로 줄 세우고, 총 K개의 조로 나누려고 한다. 각 조에는 원생이 적어도 한 명 있어야 하며, 같은 조에 속한 원생들은 서로 인접해 있어야 한다. 조별로 인원수가 같을 필요는 없다.
이렇게 나뉜 조들은 각자 단체 티셔츠를 맞추려고 한다. 조마다 티셔츠를 맞추는 비용은 조에서 가장 키가 큰 원생과 가장 키가 작은 원생의 키 차이만큼 든다. 최대한 비용을 아끼고 싶어 하는 태양이는 K개의 조에 대해 티셔츠 만드는 비용의 합을 최소로 하고 싶어 한다. 태양이를 도와 최소의 비용을 구하자.
▶입력
입력의 첫 줄에는 유치원에 있는 원생의 수를 나타내는 자연수 N(1 ≤ N ≤ 300,000)과 나누려고 하는 조의 개수를 나타내는 자연수 K(1 ≤ K ≤ N)가 공백으로 구분되어 주어진다. 다음 줄에는 원생들의 키를 나타내는 N개의 자연수가 공백으로 구분되어 줄 서 있는 순서대로 주어진다. 태양이는 원생들을 키 순서대로 줄 세웠으므로, 왼쪽에 있는 원생이 오른쪽에 있는 원생보다 크지 않다. 원생의 키는 109를 넘지 않는 자연수이다.
▶출력
티셔츠 만드는 비용이 최소가 되도록 K개의 조로 나누었을 때, 티셔츠 만드는 비용을 출력한다.
▶해설
문제를 접했을 때 키 순으로 원생들이 주어지므로 일단 인접한 원생들의 값을 구하고 정렬을 해야겠다는 생각을 했습니다. List에 차이를 각각 담고 정렬을 했습니다.
그렇다면 구해진 값들을 어떻게 활용할까?? -> 값들은 계산에만 쓰입니다. 중요한 것은 그룹화입니다.
한 그룹에 한 명의 원생만 존재한다면 0이므로 그룹에서 나올 수 있는 작은 값입니다. 예시를 보겠습니다.
ex)
5 3
1 3 5 6 10
1 3 5 6 10 이 각각 한 그룹이라고 가정합니다.
그렇다면 3개의 그룹을 만들려면 가장 작은 차이를 가진 그룹을 2번만 합치면 3 개의 그룹이 완성됩니다.
각 인접한 원생들의 값차이
1,3 -> 2
3,5 -> 2
5,6 -> 1
6,10 -> 4
정렬한다면 1, 2, 2, 4가 됩니다.
1=5,6 의 차이 2=1,3 or 3,5의 차이
정렬된 값을 기준으로 두 번의 그룹을 합치면 됩니다. 그렇다면 5,6이 합쳐지고 1,3or 3,5가 합쳐지고 10은 혼자인 그룹입니다.
위에서 나온 2 가지의 경우의 수를 보겠습니다.
{1,3} {5,6} {10} = 3
{1} {3,5,6} {10} = 3
모두 만족합니다. 가장 작은 차이 값들을 그룹의 개수에 합쳐주면 답이 구해집니다. 그룹의 개수는 n-k개를 하면 합칠 횟수를 구할 수 있습니다. (5 3일 때 5개의 개별 그룹을 2번 합치면 3개의 그룹이므로 n-k가 만족합니다.)
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; public class Main { static int n, k, result; static int[] arr; static List<Integer> list = new ArrayList<>(); public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] s1 = br.readLine().split(" "); n = Integer.parseInt(s1[0]); k = Integer.parseInt(s1[1]); arr = new int[n]; String[] s = br.readLine().split(" "); for (int i = 0; i < n; i++) { arr[i] = Integer.parseInt(s[i]); } Arrays.sort(arr); solve(); System.out.println(result); } public static void solve() { for (int i = 1; i < n; i++) { list.add(arr[i] - arr[i - 1]); } Collections.sort(list); for (int i = 0; i < n - k; i++) { result+=list.get(i); } } }

'Alogorithm > 그리디' 카테고리의 다른 글
백준 1049[자바] java 기타줄 (0) | 2022.05.07 |
---|---|
백준 2212 [자바] java 센서 (0) | 2022.02.17 |
백준 11000 [자바] java 강의실 배정 (0) | 2022.01.05 |
[백준] JAVA 21758번 꿀 따기 (0) | 2022.01.02 |
백준 JAVA 21314번 민겸수 (0) | 2021.12.28 |
댓글
이 글 공유하기
다른 글
-
백준 1049[자바] java 기타줄
백준 1049[자바] java 기타줄
2022.05.07문제 링크: https://www.acmicpc.net/problem/1049 1049번: 기타줄 첫째 줄에 N과 M이 주어진다. N은 100보다 작거나 같은 자연수이고, M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 M개의 줄에는 각 브랜드의 패키지 가격과 낱개의 가격이 공백으로 구분하여 주 www.acmicpc.net ▶문제 Day Of Mourning의 기타리스트 강토가 사용하는 기타에서 N개의 줄이 끊어졌다. 따라서 새로운 줄을 사거나 교체해야 한다. 강토는 되도록이면 돈을 적게 쓰려고 한다. 6줄 패키지를 살 수도 있고, 1개 또는 그 이상의 줄을 낱개로 살 수도 있다. 끊어진 기타 줄의 개수 N과 기타 줄 브랜드 M개가 주어지고, 각각의 브랜드에서 파는 기타 줄 6개가 들어있는 패키지의 … -
백준 2212 [자바] java 센서
백준 2212 [자바] java 센서
2022.02.17문제 링크: https://www.acmicpc.net/problem/2212 2212번: 센서 첫째 줄에 센서의 개수 N(1 ≤ N ≤ 10,000), 둘째 줄에 집중국의 개수 K(1 ≤ K ≤ 1000)가 주어진다. 셋째 줄에는 N개의 센서의 좌표가 한 개의 정수로 N개 주어진다. 각 좌표 사이에는 빈 칸이 하나 있 www.acmicpc.net ▶문제 한국 도로공사는 고속도로의 유비쿼터스화를 위해 고속도로 위에 N개의 센서를 설치하였다. 문제는 이 센서들이 수집한 자료들을 모으고 분석할 몇 개의 집중국을 세우는 일인데, 예산상의 문제로, 고속도로 위에 최대 K개의 집중국을 세울 수 있다고 한다. 각 집중국은 센서의 수신 가능 영역을 조절할 수 있다. 집중국의 수신 가능 영역은 고속도로 상에서 연결된 … -
백준 11000 [자바] java 강의실 배정
백준 11000 [자바] java 강의실 배정
2022.01.05문제 링크:https://www.acmicpc.net/problem/11000 11000번: 강의실 배정 첫 번째 줄에 N이 주어진다. (1 ≤ N ≤ 200,000) 이후 N개의 줄에 Si, Ti가 주어진다. (0 ≤ Si < Ti ≤ 109) www.acmicpc.net ▶ 문제 수강신청의 마스터 김종혜 선생님에게 새로운 과제가 주어졌다. 김종혜 선생님한테는 Si에 시작해서 Ti에 끝나는 N개의 수업이 주어지는데, 최소의 강의실을 사용해서 모든 수업을 가능하게 해야 한다. 참고로, 수업이 끝난 직후에 다음 수업을 시작할 수 있다. (즉, Ti ≤ Sj 일 경우 i 수업과 j 수업은 같이 들을 수 있다.) 수강신청 대충한 게 찔리면, 선생님을 도와드리자! ▶ 입력 첫 번째 줄에 N이 주어진다. (1 ≤… -
[백준] JAVA 21758번 꿀 따기
[백준] JAVA 21758번 꿀 따기
2022.01.02문제 링크: https://www.acmicpc.net/problem/21758 21758번: 꿀 따기 첫 번째 줄에 가능한 최대의 꿀의 양을 출력한다. www.acmicpc.net ▶ 문제 ▶ 해설 총 3 가지의 케이스로 분류할 수 있다. 1. 벌벌 ~~꿀, 꿀 ~~ 벌벌 -> 벌 두 마리가 붙어있고, 꿀이 끝에 있을 때 2. 벌 ~ 벌 ~~꿀, 꿀 ~~ 벌 ~ 벌 -> 벌이 붙어 있지 않고 꿀이 끝에 있을 때 3. 벌 ~ 꿀 ~ 벌 -> 벌과 벌 사이에 꿀이 있을 때 import java.util.*; import java.io.*; public class Main { static int n; static int[] arr; public static void main(String[] args) thr…
댓글을 사용할 수 없습니다.