백준 19644번 좀비 떼가 기관총 진지에도 오다니

JooYong Lee·2022년 1월 27일
0

문제풀이

목록 보기
13/25

요거는 2021년 05월 13일


https://www.acmicpc.net/problem/19644

정말 끔찍한 문제다

좀비 때문에 전역이 연기되다니; 상상도 하기 싫다

목함지뢰 때 아마 이등병 아니면 일병이었는데 그때 자진해서 전역 연기한 사람들 정말 대단하다

문제를 요약해보자면

좀비가 일자로 서서 다가오고 기관총의 사거리와 살상력, 대충 무슨 지뢰의 개수가 주어진다

사거리 내에 있는 좀비들은 살상력 만큼 체력이 닳고

진지에 도착하기 전에 체력을 모두 깎지 못하면 전역은 커녕 살아남지도 못한다

지뢰는 진지 바로 앞에 체력을 다 깎지 못한 좀비가 왔을 때 한방에 죽여버릴 수 있는 필살기다

마음 같아선 무조건 YES를 출력해 무사 전역시켜주고 싶지만 슬프게도 그래서는 내가 틀리고 만다

내 풀이

큐를 사용해야했고 기관총의 사거리만큼만 좀비를 큐에 담았다

좀비를 큐에 담으면서 이 좀비가 진지에 도달할 때 까지 온전히 공격을 다 받았을 때

체력이 모두 소모되는지를 확인했고 그런 경우에는 0을 큐에 넣었다

어차피 잡는게 확정된 녀석이니까

그게 아니라면 남는 체력만큼을 큐에 넣어줬다

체력이 남는 좀비는 지뢰로 잡아줘야 한다

물론 잡으면서 지뢰가 부족한지 체크해야한다

또 체력이 남은 애가 큐에 들어간 경우에는 그 뒤에 새롭게 추가되는 좀비는 또 다르게 처리해줘야했다

체력이 남은 좀비의 수 만큼 새로 들어온 좀비는 기관총 공격을 덜 맞는 것이기 때문에 체력이 덜 깎여야 했다

이 밖에도 기관총 사거리보다 앞에 있는 길의 길이가 짧은 경우도 생각해줘야했다

사실 코드화 할 때는 효율 그런거 생각하고 무식하게 했다

맞았으면 된거 아닌가 ㅎ ㅎ

코드

from sys import stdin
from collections import deque

l = int(stdin.readline()) #거리
ml, mk = map(int, stdin.readline().split()) #사거리, 살상력
c = int(stdin.readline()) #지뢰수
zombie = [int(stdin.readline()) for i in range(l)] #좀비체력

q = deque()

count = 0 #큐 안에 0이 아닌 수가 있는지 카운트
ans = True #yer or no
for i in range(min(ml,l)):  #처음 큐 채워주기
  if len(q)==0:
    if zombie[0]-mk <= 0:
      q.append(0)
    else:
      q.append(zombie[0])
      count+=1
  else:
    if count == 0:
      if zombie[i]-mk*(i+1) <= 0:
        q.append(0)
      else:
        q.append(zombie[i]-mk*(i+1))
        count+=1
    else:
      if zombie[i]-mk*(i+1-count) <= 0:
        q.append(0)
      else:
        q.append(zombie[i]-mk*(i+1-count))
        count+=1
      
for i in range(ml,l): #나머지 좀비 진행
  if q[0] == 0:
    q.popleft()
    if zombie[i]-mk*(ml-count) <= 0:
      q.append(0)
    else:
      q.append(zombie[i]-mk*(ml-count))
      count+=1
  else:
    q.popleft()
    if c>0:
      c-=1
    else:
      ans = False
      break
    if zombie[i]-mk*(ml-count) <= 0:
      q.append(0)
      count-=1
    else:
      q.append(zombie[i]-mk*(ml-count))

if ans: #아직 살아남을 가능성이 있고
  while q: #q를 비우면서 확인
    if q[0] == 0:
      q.popleft()
    else:
      q.popleft()
      count-=1
      if c>0:
        c-=1
      else:
        ans = False
        break

if ans:
  print("YES")
else:
  print("NO")
profile
21.11.01~ 기록

0개의 댓글