
내가 생각했을때 문제에서 원하는부분
첫 번째 줄에 굴다리의 길이 N 이 주어진다. (1 ≤ N ≤ 100,000)
두 번째 줄에 가로등의 개수 M 이 주어진다. (1 ≤ M ≤ N)
다음 줄에 M 개의 설치할 수 있는 가로등의 위치 x 가 주어진다. (0 ≤ x ≤ N)
가로등의 위치 x는 오름차순으로 입력받으며 가로등의 위치는 중복되지 않으며, 정수이다.
굴다리의 길이 N을 모두 비추기 위한 가로등의 최소 높이를 출력한다.
내가 이 문제를 보고 생각해본 부분
입력으로 굴다리 길이 N, 가로등 개수 M, 가로등 위치 배열을 받는다.
첫 번째 가로등 위치와 길이 시작점(0)과의 거리를 계산하여 leftGap에 저장한다.
최소 높이는 적어도 이 값 이상이어야 한다.
마지막 가로등 위치와 길이 끝점(N)과의 거리를 rightGap에 저장한다.
가로등들 사이의 거리 중 가장 긴 것을 찾아 maxMid에 저장한다.
중간 간격을 양쪽에서 빛이 비춘다고 가정해 절반만 비추면 되므로 나누기 2를 한다.
leftGap, rightGap, maxMid/2 중 가장 큰 값이 최소 높이가 된다.
중간 간격은 정수 나눗셈 시 올림 처리를 위해 (maxMid + 1)/2로 계산한다.
예를 들어, 간격이 3일 때 높이는 2가 되어야 충분히 빛이 닿는다.
마지막으로 결과를 출력한다.
출력 후 BufferedReader를 닫는다.
코드로 구현
package baekjoon.baekjoon_33;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
// 백준 17266번 문제
public class Main1311 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine()); // 굴다리 길이
int M = Integer.parseInt(br.readLine()); // 가로등 개수
int[] positions = new int[M];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < M; i++) {
positions[i] = Integer.parseInt(st.nextToken());
}
// 1. 좌측 끝부터 가로등까지 거리
int leftGap = positions[0] - 0;
// 2. 우측 끝까지 거리
int rightGap = N - positions[M-1];
// 3. 중간 가로등 사이 최대 간격의 절반
int maxMid = 0;
for (int i = 0; i < M - 1; i++) {
int gap = positions[i+1] - positions[i];
maxMid = Math.max(maxMid, gap);
}
int result = Math.max(leftGap, rightGap);
// 강제 올림을 위해 중간 간격은 (gap + 1) / 2 처리
result = Math.max(result, (maxMid + 1) / 2);
System.out.println(result);
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.