풀이
처음에는 조합으로 접근했다가 시간초과가 나서 다른 방법을 고민을 하게했던 문제입니다.
우선, 각 구간들의 길이들을 구해 배열에 저장하고 그 배열을 오름차순으로 정렬했습니다.
다음으로, N - K개의 구간 길이들을 더해준다면 문제에서 요구한 K개의 발전소를 설치한 것과 같은 결과가 나오게되어 해결할 수 있었습니다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Solution {
public static int N, K, answer;
public static int[] cityMap, cityLen;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder("");
StringTokenizer st = null;
int T = Integer.parseInt(br.readLine());
for (int tc = 1; tc <= T; ++tc) {
st = new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
cityMap = new int[N];
// 각 구간의 길이를 저장하기에 N - 1의 크기만 필요
cityLen = new int[N - 1];
st = new StringTokenizer(br.readLine(), " ");
for (int i = 0; i < N; ++i) {
cityMap[i] = Integer.parseInt(st.nextToken());
}
int answer = 0;
// 각 구간의 길이를 구한다.
for (int i = 0; i < N - 1; ++i) {
cityLen[i] = cityMap[i + 1] - cityMap[i];
}
// 작은 순으로 꺼내기위해 오름차순 정렬
// 즉, 가장 큰 구간 길이를 가진 곳에는 K개의 발전소를 설치한다는 의미
Arrays.sort(cityLen);
// 발전소를 제외한 N - K개의 집에는 전선을 설치하므로
// 전선의 길이를 더해준다.
for (int i = 0; i < N - K; ++i) {
answer += cityLen[i];
}
sb.append("#").append(tc).append(" ").append(answer).append("\n");
}
System.out.println(sb);
}
}
'알고리즘 > SWEA' 카테고리의 다른 글
[Java] SWEA 4366번 정식이의 은행 업무 (0) | 2021.04.20 |
---|---|
[Java] SWEA 4301번 콩 많이 심기 (0) | 2021.04.19 |
[Java] SWEA 3143번 가장 빠른 문자열 타이핑 (0) | 2021.04.12 |
[Java] SWEA 5643번 키 순서 (0) | 2021.04.06 |
[Java] SWEA 2819번 격자판의 숫자 이어 붙이기 (0) | 2021.04.05 |