카테고리 없음

[코딩테스트] SWEA 3503 초보자를 위한 점프대 설치하기(Java)

[dev] hiro 2025. 7. 3. 11:08
제가 공부한 내용을 정리하는 블로그입니다.
아직 많이 부족하고 배울게 너무나도 많습니다. 틀린내용이 있으면 언제나 가감없이 말씀해주시면 감사하겠습니다😁
SWEA 3503 초보자를 위한 점프대 설치하기입니다.

포인트

해당 문제에서 구하라는 부분은 두 점프대의 높이차 중에서 가장 큰 값을 최소화하는 것입니다.

그래서 오름차순(내림차순)으로 정렬하면 차이가 적지 않나 라고 생각했지만, 점프대는 원형으로 설치하는 것이 문제입니다.

따라서 배열을 원형이라고 생각하여
배열의 0번의 왼쪽 인덱스는 N-1, 오른쪽 인덱스는 1로 생각하여 정렬된 기준으로 점프대의 높이를 설치합니다.

소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Collections;
import java.util.StringTokenizer;

public class Q3503 {
    private static int tc, N;
    private static Integer[] heights;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        tc = Integer.parseInt(br.readLine());

        StringBuilder sb = new StringBuilder();
        StringTokenizer st;
        for (int t = 1; t <= tc; t++) {
            N = Integer.parseInt(br.readLine());
            heights = new Integer[N];
            st = new StringTokenizer(br.readLine());
            for (int i = 0; i < N; i++) {
                heights[i] = Integer.parseInt(st.nextToken());
            }
            Arrays.sort(heights, Collections.reverseOrder());

            int idx = 0;
            int[] ans = new int[N];
            Arrays.fill(ans, -1);
            ans[idx] = heights[idx];
            idx++;
            for (int i = 1; i < N; i++) {
                int num = heights[i];
                if (ans[N - idx] == -1 && ans[idx] == -1) {
                    ans[N - idx] = num;
                } else if (ans[idx] == -1) {
                    ans[idx] = num;
                    idx++;
                }
            }

            int maxDiff = 0;
            for (int i = 0; i < N; i++) {
                int diff = Math.abs(ans[i] - ans[(i + 1) % N]);
                maxDiff = Math.max(maxDiff, diff);
            }
            sb.append("#").append(t).append(" ").append(maxDiff).append("\n");
        }
        System.out.println(sb);
    }
}

/*
3
7
13 10 12 11 10 11 12
5
2 4 5 7 9
8
6 6 6 6 6 6 6 6
 */

코드 설명

  • Arrays.sort(heights, Collections.reverseOrder());
    프대 높이를 내림차순으로 정렬 (높은 점프대부터 배치하기 위해).
for (int i = 1; i < N; i++) {
    int num = heights[i];
    if (ans[N - idx] == -1 && ans[idx] == -1) {
        ans[N - idx] = num;
    } else if (ans[idx] == -1) {
        ans[idx] = num;
        idx++;
    }
}
  • 두 번째 점프대부터는 idx를 기준으로 좌우 교차 배치합니다.(N-idx는 왼쪽 인덱스, idx는 오른쪽 인덱스)
  • 이렇게 하면 큰 높이차가 발생할 수 있는 인접 점프대를 최대한 멀리 배치할 수 있습니다.
int maxDiff = 0;
for (int i = 0; i < N; i++) {
    int diff = Math.abs(ans[i] - ans[(i + 1) % N]);
    maxDiff = Math.max(maxDiff, diff);
}
  • 원형 구조이므로 마지막과 첫 번째 점프대도 인접합니다.
  • 인접한 점프대들 사이의 높이 차이를 모두 계산하고, 그 중 최댓값을 구합니다.