https://www.acmicpc.net/problem/21921
21921번: 블로그
첫째 줄에 $X$일 동안 가장 많이 들어온 방문자 수를 출력한다. 만약 최대 방문자 수가 0명이라면 SAD를 출력한다. 만약 최대 방문자 수가 0명이 아닌 경우 둘째 줄에 기간이 몇 개 있는지 출력한다
www.acmicpc.net
내 코드
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
viewer = [0] + list(map(int, input().split()))
if max(viewer) == 0:
print('SAD')
else:
window = sum(viewer[:m])
answer = window
cnt =1
for i in range(m, n+1):
window += viewer[i] - viewer[i-m]
if window > answer:
answer = window
cnt =1
elif window == answer:
cnt +=1
print(answer)
print(cnt)
코드 리뷰
슬라이딩 윈도우
슬라이딩 윈도우 문제를 처음 풀어보았다. 지금까지는 단순히 부분합이라고 여기고 풀었던 문제가, 연속된 수를 이용하는 거라면 슬라이딩 윈도우라는 알고리즘에 해당하는 것이었다.
viewer = [0] + list(map(int, input().split()))
1부터 n까지 그 자리에 저장하기 위해서 이렇게 초기화했다.
if max(viewer) == 0:
print('SAD')
else:
window = sum(viewer[:m])
answer = window
cnt =1
for i in range(m, n+1):
window += viewer[i] - viewer[i-m]
if window > answer:
answer = window
cnt =1
elif window == answer:
cnt +=1
그리고 부분합이 0이라는 것은 결국 숫자 배열의 부분 합도 0, 숫자들도 0이라는 것이므로 먼저 조건을 처리한다.
앞으로는 m 크기의 틀을 가진 윈도우를 이리저리 움직이며 연산을 진행할 것이다.
그리고 window라는 수에 0부터 m까지의 합을 저장한다.
이후 m부터 n까지 윈도우를 움직이면서 연산한다.
i는 1씩 증가하는 상태에서 window에 i번째의 값을 더해주고, 동시에 i-m번째의 수를 뺀다. (한 칸 옆으로 이동한 윈도우)
만약 최댓값을 발견했다면 cnt는 1로 초기화해주고, 최댓값과 동일한 크기라면 +1 을 해준다.
슬라이딩 윈도우의 개념을 익히기에 좋은 문제였다.
https://beehand.tistory.com/114
슬라이딩 윈도우 알고리즘 (Sliding Window)
슬라이딩 윈도우 알고리즘이란 1,2,3,4,5 라는 숫자 배열이 있다. 이 안에서 A[i] + A[i+1] + A[i+2]라는 형식으로 연속적인 3개의 숫자 합을 구하려고 한다. [1,2,3],4,5 / 1,[2,3,4],5 / 1,2,[3,4,5] 이런 식으로 창
beehand.tistory.com
슬라이딩 윈도우에 대한 설명은 여기서 확인할 수 있다.
'코딩테스트 대비 > 백준(BOJ)' 카테고리의 다른 글
| [Python][백준/BOJ] 2003번 : 수들의 합 2 (0) | 2023.08.02 |
|---|---|
| [Python][백준/BOJ] 12891번 : DNA 비밀번호 (0) | 2023.08.01 |
| [Python][백준/BOJ] 11403번 : 경로 찾기 (0) | 2023.08.01 |
| [Python][백준/BOJ] 1325번 : 효율적인 해킹 (0) | 2023.08.01 |
| [Python][백준/BOJ] 6118번 : 숨바꼭질 (0) | 2023.08.01 |