2026년 4월 28일에 백준 사이트가 서비스 종료되므로 문제 링크 미첨부
NOYES입력
6
3 2
2
3
4
6
6
6
6
출력
NO
입력
6
3 2
1
2
4
6
6
6
8
출력
YES
기관총은 매 미터 쏠 수 있지만, 지뢰를 사용한 턴에는 쏠 수 없습니다.
큐의 크기(q.size())는 현재 좀비의 위치에서 기관총 대미지를 방해하는 지뢰 사용 횟수를 의미합니다.
q.peekFirst() < i 조건은 해당 지점에서 사용했던 지뢰의 영향(기관총 사격 불가 범위)이 현재 위치 i를 벗어났음을 의미하므로 큐에서 제거합니다.
int damage = (Math.min(ml, i) - q.size()) * mk;
Math.min(ml, i):
좀비가 미터 지점에서 미터 지점까지 오면서
받을 수 있는 최대 사격 횟수입니다.
(사거리 보다 멀리 있다면 최대 번, 가깝다면 번)
여기에 q.size()를 빼줌으로써
지뢰를 쓰느라 총을 쏘지 못한 횟수를 제외한 실제 타격 횟수를 구하고 공격력 를 곱합니다.
z > damage:
계산된 대미지로 좀비를 죽일 수 없다면
이 좀비는 반드시 지뢰로 처리해야 합니다.
지뢰를 사용하면 를 감소시키고, 큐에 을 넣습니다.
이는 현재 위치에서 쏜 지뢰 때문에
향후 사거리 동안은 기관총 사격 횟수가 1회씩 손실됨을 기록하는 것입니다.
만약 지뢰가 부족하다면 즉시 NO를 반환합니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.StringTokenizer;
public class Main {
static StringTokenizer st;
public static void main(String[] args) throws IOException {
System.out.println(greedy());
}
private static String greedy() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int L = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine());
int ml = Integer.parseInt(st.nextToken());
int mk = Integer.parseInt(st.nextToken());
int C = Integer.parseInt(br.readLine());
ArrayDeque<Integer> q = new ArrayDeque<>();
for (int i = 1; i <= L; i++) {
if (!q.isEmpty() && q.peekFirst() < i) q.poll();
int z = Integer.parseInt(br.readLine());
int damage = (Math.min(ml, i) - q.size()) * mk;
if (z > damage) {
if (--C < 0) return "NO";
q.offer(i+ml-1);
}
}
return "YES";
}
}