알고리즘/백준

[BOJ#21921] 블로그

Jinoo.keem 2024. 5. 1. 21:13
728x90

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

1 초 512 MB 11714 4897 3995 41.109%

문제

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

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

 

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

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

입력

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

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

출력

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

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

제한

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

제출 코드

# X일 동안 가장 많이 들어온 <방문자수, 기간>
# 블로그를 시작하고 지난 일수 N, X일 동안 가장 많이 들어옴
N, X = map(int, input().split())
arr = list(map(int, input().split()))
# X일 동안의 최대값을 구해야한다.
# 1. for문으로 전부 다 비교하면서 갱신?
# 2. dp 리스트를 만들어서 최대값만 반환? O(n)
dp = sum(arr[:X])

sumone = dp
cnt = 1
for i in range(1, N-X+1):
    dp = dp - arr[i-1] + arr[i+X-1]
    
    if sumone < dp:
        sumone = dp
        cnt = 1
    elif dp == sumone:
        cnt += 1

if dp == 0:
    print('SAD')
    exit()
else:
    print(sumone)
    print(cnt)

 

dp를 이용하여 최대값이 바뀔때마다 갱신해주고, 만약 같다면 갯수를 추가해 주는 방식으로 코드를 설계했다.

슬라이딩 윈도우라는 방식이라는데 이전 문제와 발상은 비슷하지만 값을 저장하는 방식이 달랐다.

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

[BOJ#10026] 적록색약  (0) 2024.05.08
[BOJ#14620] 꽃 길  (0) 2024.05.05
[BOJ#1764] 듣보잡  (1) 2024.04.30
[BOJ#24553] 팰린드롬 게임  (0) 2024.04.30
[BOJ#17484] 진우의 달 여행 - small  (0) 2024.04.30