알고리즘/백준

백준 21921: 블로그 (Python)

sssbin 2023. 6. 15. 17:07

 

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

 

21921번: 블로그

첫째 줄에 $X$일 동안 가장 많이 들어온 방문자 수를 출력한다. 만약 최대 방문자 수가 0명이라면 SAD를 출력한다. 만약 최대 방문자 수가 0명이 아닌 경우 둘째 줄에 기간이 몇 개 있는지 출력한다

www.acmicpc.net

 

투 포인터 이용

n, x = map(int, input().split())
visitors = list(map(int, input().split()))

i = j = 0
temp = result = 0
cnt = 0

for i in range(n):
    # 끝 포인터 이동
    while j-i < x and j < n:
        temp += visitors[j]
        j += 1

    # x일
    if j-i == x:
        if result < temp:
            result = temp
            cnt = 1
        elif result == temp:
            cnt += 1

    # 시작 포인터 값 빼주기
    temp -= visitors[i]

if result == 0:
    print("SAD")
else:
    print(result)
    print(cnt)

 

다 풀고 다른 사람의 코드를 참고해보다가

슬라이딩 윈도우 알고리즘을 적용해보았다.

 

슬라이딩 윈도우란?

고정 사이즈의 윈도우가 이동하면서 윈도우 내에 있는 데이터를 이용해 문제를 풀이하는 알고리즘이다.

 

n, x = map(int, input().split())
visitors = list(map(int, input().split()))

# 초기값
result = temp = sum(visitors[:x])
cnt = 1

for i in range(x, n):
    temp += visitors[i] - visitors[i-x] # 누적합 계산

    if result < temp:
        result = temp
        cnt = 1
    elif result == temp:
        cnt += 1

if result == 0:
    print("SAD")
else:
    print(result)
    print(cnt)

 

 

투 포인터 이용했을 때

슬라이딩 윈도우 이용했을 때

 

 

'알고리즘 > 백준' 카테고리의 다른 글

백준 16918: 봄버맨 (Python)  (0) 2023.05.02
백준 12933: 오리 (Python)  (0) 2023.04.14
백준 1766: 문제집 (Python)  (0) 2022.08.05
백준 2252: 줄 세우기 (Python)  (0) 2022.08.05
백준 2887: 행성 터널 (Python)  (0) 2022.08.04