문제)
찬솔이는 블로그를 시작한 지 벌써 일이 지났다.
요즘 바빠서 관리를 못 했다가 방문 기록을 봤더니 벌써 누적 방문 수가 6만을 넘었다.
찬솔이는 일 동안 가장 많이 들어온 방문자 수와 그 기간들을 알고 싶다.
찬솔이를 대신해서 일 동안 가장 많이 들어온 방문자 수와 기간이 몇 개 있는지 구해주자.
입력)
첫째 줄에 블로그를 시작하고 지난 일수 와 가 공백으로 구분되어 주어진다.
둘째 줄에는 블로그 시작 일차부터 일차까지 하루 방문자 수가 공백으로 구분되어 주어진다.
- 방문자 수
출력)
첫째 줄에 일 동안 가장 많이 들어온 방문자 수를 출력한다. 만약 최대 방문자 수가 0명이라면 SAD를 출력한다.
만약 최대 방문자 수가 0명이 아닌 경우 둘째 줄에 기간이 몇 개 있는지 출력한다.
풀이)
※ 풀이 아이디어
고정된 크기의 Sliding Window를 적용하여 X일 동안의 방문자 수 구하기
1. 첫 번째 X일 동안의 방문자 수 구하기
2. 한칸 씩 이동하며 방문자수를 갱신하고 max 값과 비교
N, X = map(int, input().split())
# 방문자 수
visitors = list(map(int, input().split()))
# 최대 방문자 수, 최대 방문자 기간 일수
max_visitor, max_visitor_count = sum(visitors[0:X]), 1
range_sum = max_visitor
if max(visitors) == 0:
print("SAD")
else:
for i in range(X, N):
range_sum -= visitors[i-X]
range_sum += visitors[i]
if range_sum > max_visitor:
max_visitor = range_sum
max_visitor_count = 1
elif range_sum == max_visitor:
max_visitor_count += 1
print(f"{max_visitor}\n{max_visitor_count}")
※ 처음 풀이
for i in range(N):
start = i
end = i + X
if end >= N:
break
range_sum = sum(visitors[start:end])
if range_sum > max_visitor:
max_visitor = range_sum
max_visitor_count = 0
elif range_sum == max_visitor:
max_visitor_count += 1
처음에는 가볍게 start와 end를 두고 한칸씩 이동해가며 range_sum을 구하였다.
하지만 시간 초과가 났고 원인을 찾는데 꽤 애를 먹었다.
그래서 GPT의 도움을 받아 원인을 물어보니 sum(visitors[start:end])로 부분 합을 구할 때 Indexing을 통해 array에 접근하게 되어 최악의 경우 $O(N^2)$이 나올 수 있다는 것이었다.
그래서 위와 같이 Window 크기만큼 이동하면서 하나씩 더해주고 빼주는 과정을 통해 시간초과를 해결할 수 있게 되었다.
반응형
'Coding Test' 카테고리의 다른 글
[Coding Test][Python][백준] BOJ #11501 주식 (0) | 2025.02.21 |
---|---|
[Coding Test][Python][백준] BOJ #17484 진우의 달 여행 (0) | 2025.02.05 |
[Coding Test][Python][백준] BOJ #1466 지름길 (0) | 2025.02.05 |
[Coding Test][Python][백준] BOJ #20922 겹치는 건 싫어 (0) | 2025.02.05 |
[Coding Test][Python][백준] BOJ #17266 어두운 굴다리 (1) | 2025.02.04 |