Algorithm (Python, Java, SQL)/BaekJoon

[백준 21921번] 블로그 (Python)

sanadoing_ 2023. 11. 13. 20:34
728x90

> 파이썬, 누적 합, 슬라이딩 윈도우

 

 

 

 

📖 문제 : 블로그 (Python)

 

 

찬솔이는 블로그를 시작한 지 벌써 일이 지났다.

요즘 바빠서 관리를 못 했다가 방문 기록을 봤더니 벌써 누적 방문 수가 6만을 넘었다.

 

찬솔이는 일 동안 가장 많이 들어온 방문자 수와 그 기간들을 알고 싶다.

찬솔이를 대신해서 일 동안 가장 많이 들어온 방문자 수와 기간이 몇 개 있는지 구해주자.

 

 

 

입력

첫째 줄에 블로그를 시작하고 지난 일수 가 공백으로 구분되어 주어진다.

둘째 줄에는 블로그 시작 일차부터 일차까지 하루 방문자 수가 공백으로 구분되어 주어진다.

 

출력

첫째 줄에 일 동안 가장 많이 들어온 방문자 수를 출력한다. 만약 최대 방문자 수가 0명이라면 SAD를 출력한다.

만약 최대 방문자 수가 0명이 아닌 경우 둘째 줄에 기간이 몇 개 있는지 출력한다.

 

제한

  •  1 ≤ X ≤ N ≤ 250,000
  •  0 ≤ 방문자 수 ≤ 8,000

 

예제 입력 1 

5 2
1 4 2 5 1

 

예제 출력 1 

7
1

 

 

 

 

내 코드

N, X = map(int, input().split())
numbers = list(map(int, input().split()))
maxN, cnt = sum(numbers[0:X]), 1
sumN = maxN
for i in range(1, len(numbers)-X+1):
    sumN = sumN - numbers[i-1] + numbers[i+X-1]
    if sumN > maxN:
        maxN = sumN
        cnt = 1
    elif sumN == maxN:
        cnt += 1
if maxN == 0:
    print("SAD")
else:
    print(maxN)
    print(cnt)

 

 

 

 

 

Point ! ⭐️ 

  • 길이가 X인 슬라이딩 윈도우를 구현하였지만, 여기서는 시간을 줄이기 위해서 길이가 X인 모든 수를 그때마다 sum함수를 사용해 더해주는 것이 아닌, 윈도우가 +1씩 이동하는 것이므로
    처음 합만 구한 후 빠지는 수만 빼주고 그 다음수만 더해주면서 두 개의 값만 계속 빼고 더하는 방식으로 구현하였습니다. 

 

 

 

 

 

 

 

백준

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

 

21921번: 블로그

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

www.acmicpc.net

 

728x90