@@@ 알고리즘/백준 스터디

14465 - 해답

HTG 2021. 8. 8. 20:18
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)

 

'@@@ 알고리즘 > 백준 스터디' 카테고리의 다른 글

3987 - 해결  (0) 2021.08.10
2156 - 해답  (0) 2021.08.09
2591 - 해결  (0) 2021.08.08
9547 - 해답  (0) 2021.08.08
2468 - 해결  (0) 2021.08.08