https://www.acmicpc.net/problem/21921
21921번: 블로그
첫째 줄에 $X$일 동안 가장 많이 들어온 방문자 수를 출력한다. 만약 최대 방문자 수가 0명이라면 SAD를 출력한다. 만약 최대 방문자 수가 0명이 아닌 경우 둘째 줄에 기간이 몇 개 있는지 출력한다
www.acmicpc.net
문제
찬솔이는 블로그를 시작한 지 벌써 일이 지났다.
요즘 바빠서 관리를 못 했다가 방문 기록을 봤더니 벌써 누적 방문 수가 6만을 넘었다.

찬솔이는 일 동안 가장 많이 들어온 방문자 수와 그 기간들을 알고 싶다.
찬솔이를 대신해서 일 동안 가장 많이 들어온 방문자 수와 기간이 몇 개 있는지 구해주자.
입력
첫째 줄에 블로그를 시작하고 지난 일수 와 가 공백으로 구분되어 주어진다.
둘째 줄에는 블로그 시작 일차부터 일차까지 하루 방문자 수가 공백으로 구분되어 주어진다.
출력
첫째 줄에 일 동안 가장 많이 들어온 방문자 수를 출력한다. 만약 최대 방문자 수가 0명이라면 SAD를 출력한다.
만약 최대 방문자 수가 0명이 아닌 경우 둘째 줄에 기간이 몇 개 있는지 출력한다.
제한
- 1 ≤
- 0 ≤ 방문자 수 ≤ 8,000
코드 정답
import sys
input = sys.stdin.readline
# 21921
n, x = map(int, input().split())
if (not (1 <= x <= n <= 250000)):
exit()
li = list(map(int, input().split()))
if max(li) == 0:
print("SAD")
else:
li_num = sum(li[0:x])
value = li_num
cnt = 1
for i in range(x, n):
value -= li[i-x]
value += li[i]
if value > li_num:
li_num = value
cnt = 1
elif value == li_num:
cnt += 1
print(li_num)
print(cnt)
풀이
input보다 빠른 sys.stdin.readline을 사용하기 위해 아래와 같은 코드를 작성합니다. 저렇게 한다면 input으로 sys.stdin.readline의 효율을 낼 수 있습니다.
import sys
input = sys.stdin.readline
띄워쓰기를 기준으로 정수값 두 개를 입력받아 각각 변수 n과 x에 대입합니다. 조건에 알맞지 않으면 코드가 종료가 됩니다. 이후 띄워쓰기를 기준으로 정수값 n개를 입력받아 그것을 각각의 인덱스에 저장하여 변수 li에 리스트 형식으로 저장합니다.
n, x = map(int, input().split())
if (not (1 <= x <= n <= 250000)):
exit()
li = list(map(int, input().split()))
만약 li에 저장되어 있는 값 중에서 가장 큰 값이 0일 경우 SAD가 출력되고 코드는 종료됩니다.
if max(li) == 0:
print("SAD")
가장 큰 값이 0이 아닐 경우 li의 인덱스 번호 0번부터 x-1번까지를 더하고 그 값을 li_num변수에 저장합니다. 이후 변수 value에 li_num을 저장합니다. cnt란 변수에 값을 1을 저장합니다.
else:
li_num = sum(li[0:x])
value = li_num
cnt = 1
x값부터 n값이 될 때까지 그 값을 i에 저장하며 반복을합니다. 반복일 될 때마다 value = value - li[i-x]와 value = value + li[i]를 해줍니다. 이후 value에 저장되어 있는 값이 li_num보다 클 시 li_num에 value값을 저장해주고 cnt의 값은 1로 바꿔주고서 반복문을 돕니다. 만약 value 값이 li_num 값과 같을 시에는 cnt의 값을 1 증가시킨 후 반복문을 돕니다.
for i in range(x, n):
value -= li[i-x]
value += li[i]
if value > li_num:
li_num = value
cnt = 1
반복문에서 빠져나오게 된다면 li_num과 cnt의 값을 출력하게 됩니다.
print(li_num)
print(cnt)
'BaekJoon > 누적합' 카테고리의 다른 글
[백준] 부분합 - 1806번 문제 (Python) (0) | 2023.04.01 |
---|---|
[백준] 합 구하기 - 11441번 문제 (Python) (0) | 2023.03.30 |
[백준] 순서쌍의 곱의 합 - 13900번 문제 (Python) (0) | 2023.03.26 |
[백준] Maximum Subarray - 10211번 문제 (Python) (0) | 2023.03.24 |
[백준] 2차원 배열의 합 - 2167번 문제 (Python) (0) | 2023.03.23 |