관리 메뉴

JIE0025

[BOJ - 슬라이딩윈도우] 14465번 : 소가 길을 건너간 이유 5 (python) 본문

알고리즘/백준

[BOJ - 슬라이딩윈도우] 14465번 : 소가 길을 건너간 이유 5 (python)

Kangjieun11 2022. 5. 27. 17:28
728x90

백준 알고리즘 - 슬라이딩윈도우, 누적합, 14465번 소가 길을 건너간 이유5 , 파이썬

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

 

14465번: 소가 길을 건너간 이유 5

첫 줄에 N, K, B (1 ≤ B,K ≤ N)가 주어진다. 그 다음 B줄에는 고장난 신호등의 번호가 하나씩 주어진다.

www.acmicpc.net

 

 

문제

농부 존의 농장에 원형 길이 있다고 했지만, 길은 그뿐만이 아니다. 그 옆에 일자형 길이 있는데, 1번부터 N번까지의 번호가 붙은 횡단보도 N (1 ≤ N ≤ 100,000)개로 이루어져 있다. 교통사고를 방지하기 위해 존은 각 횡단보도에 신호등을 설치해 놓았다. 그러던 어느 날, 강력한 뇌우로 인해 몇몇 신호등이 망가졌다. 존은 연속한 K개의 신호등이 존재하도록 신호등을 수리하고 싶다. 이번에도 우리가 존을 도와주자.

입력

첫 줄에 N, K, B (1 ≤ B,K ≤ N)가 주어진다. 그 다음 B줄에는 고장난 신호등의 번호가 하나씩 주어진다.

출력

정상적으로 작동하는 연속 K개의 신호등이 존재하려면 최소 몇 개의 신호등을 수리해야 하는지 출력한다.

 


 

슬라이딩 윈도우를 사용하면 아주 쉽게 풀수 있다.

 

 

https://jie0025.tistory.com/202

 

[ 알고리즘 ] 슬라이딩 윈도우

슬라이딩 윈도우? 투포인터와 매우 비슷한 알고리즘으로 리스트 안에 윈도우(특정 범위)가 있을때 윈도우 내부 요소들의 값을 이용하여 문제를 풀이하는 알고리즘이다. 투포인터는 두개의 포인

jie0025.tistory.com

 

 

일단 입력을 받고, 

trafficLight라는 변수에 1부터 n까지 넣어주었다.

그다음 고장난 번호의 신호등은 -1로 바꿔주고,

 

k사이즈의 윈도우(범위) 안에서 고장난 신호등(-1)의 개수를 찾는다.

 

윈도우가 이동할 때 맨앞에 있던 신호등이 고장났었는지, 맨 뒤에 있는 신호등이 고장났는지 체크하여 count를 증감한다.

 

 

최소값을 찾으면 끝

 

 

 

정답 코드

#14465_소가 길을 건너간 이유 5_sliding window_silver2

import sys
input = sys.stdin.readline

n, k, b = map(int,input().split())
trafficLight = [i for i in range(1,n+1)]

for i in range(b):
    trafficLight[int(input())-1] = -1

res = 0
for i in range(k):
    if trafficLight[i] == -1:
        res += 1

count = res
for i in range(1,n-k+1):
    if trafficLight[i-1] == -1:
        count -=1
    if trafficLight[i+k-1] == -1:
        count += 1

    res = min(res, count)

print(res)