https://www.acmicpc.net/problem/15889
N명이 수직선 상에 일렬로 서 있고, 욱제는 항상 pos[0] = 0에 위치함N-1)까지 전달되면 성공, 중간에 멈추면 실패그리디 + 스위핑 알고리즘
- 왼쪽부터 오른쪽으로 전우들을 순회하면서
- 현재까지 도달 가능한 최대 거리(
maxReach)를 갱신- 다음 전우가
maxReach보다 멀리 있으면 → 수류탄 떨어짐 → 실패
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] pos = new int[N]; // 위치 배열
int[] range = new int[N - 1]; // 사거리 배열
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
pos[i] = Integer.parseInt(st.nextToken());
}
if (N > 1) {
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N - 1; i++) {
range[i] = Integer.parseInt(st.nextToken());
}
}
int maxReach = 0; // 현재까지 도달 가능한 가장 먼 위치
int i = 0; // 지금 탐색할 사람의 인덱스
for (; i < N - 1 && pos[i] <= maxReach; i++) {
int reach = pos[i] + range[i]; // 이 전우가 던질 수 있는 거리
maxReach = Math.max(maxReach, reach); // 최대 도달 위치 갱신
// 다음 전우가 pos[]에 정렬되어 있으므로 i만 증가
}
// 마지막 전우의 위치가 maxReach 이하라면 도달 가능
if (pos[N - 1] <= maxReach) {
System.out.println("권병장님, 중대장님이 찾으십니다");
} else {
System.out.println("엄마 나 전역 늦어질 것 같아");
}
}
}
int N = Integer.parseInt(br.readLine());
int[] pos = new int[N];
int[] range = new int[N - 1]; // 마지막 전우는 던지지 않음
pos[i]: i번째 전우의 위치range[i]: i번째 전우가 수류탄을 던질 수 있는 거리N-1명까지만 사거리를 입력받는 이유는 마지막 전우는 ****던지지 않기 때문for (int i = 0; i < N - 1 && pos[i] <= maxReach; i++) {
maxReach보다 작거나 같아야만 도달 가능pos[i] > maxReach가 되먄, 수류탄 전달 불가 → breakint reach = pos[i] + range[i];
if (pos[N - 1] <= maxReach)
System.out.println("권병장님, 중대장님이 찾으십니다");
else
System.out.println("엄마 나 전역 늦어질 것 같아");
pos[N-1]가 현재까지의 maxReach보다 작거나 같으면 도달 가능시간복잡도 : O(N)