728x90
소가 길을 건너간 이유 5
문제
농부 존의 농장에 원형 길이 있다고 했지만, 길은 그뿐만이 아니다.
그 옆에 일자형 길이 있는데, 1번부터 N번까지의 번호가 붙은 횡단보도 N (1 ≤ N ≤ 100,000)개로 이루어져 있다.
교통사고를 방지하기 위해 존은 각 횡단보도에 신호등을 설치해 놓았다.
그러던 어느 날, 강력한 뇌우로 인해 몇몇 신호등이 망가졌다.
존은 연속한 K개의 신호등이 존재하도록 신호등을 수리하고 싶다. 이번에도 우리가 존을 도와주자.
입력
첫 줄에 N, K, B (1 ≤ B,K ≤ N)가 주어진다. 그 다음 B줄에는 고장난 신호등의 번호가 하나씩 주어진다.
출력
정상적으로 작동하는 연속 K개의 신호등이 존재하려면 최소 몇 개의 신호등을 수리해야 하는지 출력한다.
처음에는 각각의 합으로 했지만 시간 초과가 났다.
import sys
N, K, B = map(int,sys.stdin.readline().split())
sign = [0] * (N + 1)
for i in range(B):
sign[int(sys.stdin.readline())] = 1
min = N
for i in range(1,N-K+2):
if min > sum(sign[i:i+K]):
min = sum(sign[i:i+K])
print(min)
그래서 알고리즘을 보니 누적합하는 방법이 있었서 내가 한 방법과 비슷하지만 시간은 단축시킬수 있는 방법이길래 사용하였다.
import sys
N, K, B = map(int,sys.stdin.readline().split())
# 고장난 신호등 초기화
sign = [0] * (N + 1)
# 고장난 신호등 저장
for i in range(B):
sign[int(sys.stdin.readline())] = 1
# K번째까지 망가진 것을 최소로 시작
min = sum(sign[:K+1])
cnt = min
# K번째 까지를 미리 구하고 하나씩 나가면서 갯수를 세린다.
for i in range(K+1,N+1):
# 해당 신호등이 고장이면 증가
if sign[i]:
cnt += 1
# K 번째 전인 신호등은 이제 빠지니깐 고장난 신호등이면 감소
if sign[i-K]:
cnt -= 1
# 그렇게 최소인 것을 저장
if min > cnt:
min = cnt
print(min)