반응형
백준 BAEKJOON 29718번 줄줄이 박수 [PYTHON/파이썬]
<문제 출처> (SILVER Ⅲ)
https://www.acmicpc.net/problem/29718
<풀이>
2차원 리스트에 대한 누적합을 이용하면 쉽게 풀 수 있다.
먼저 박수 횟수가 저장되는 clap 리스트에 입력 값을 받아준다.
그리고 2중 for문을 사용하여 박수 횟수에 대한 누적합을 S 리스트에 담아준다.
for i in range(1, N + 1):
for j in range(1, M + 1):
S[i][j] = S[i - 1][j] + S[i][j - 1] - S[i - 1][j - 1] + clap[i][j]
예제 입력 1을 기준으로 누적합을 채운 리스트는 아래와 같이 작성된다.
이 누적합을 토대로 브실이가 정한 열의 개수 A만큼 박수 횟수의 최댓값을 구해주면 된다.
즉 마지막 행인 0, 4, 14, 18, 30을 활용하면 된다.
A = 2일 때,
- 열 1~2의 합 : 1 + 5 + 2 + 3 + 1 + 2 = 14 → S[-1][2] - S[-1][0] = 14 - 0 = 14
- 열 2~3의 합 : 5 + 2 + 3 + 1 + 2 + 1 = 14 → S[-1][3] - S[-1][1] = 18 - 4 = 14
- 열 3~4의 합 : 2 + 6 + 1 + 5 + 1 + 1 = 16 → S[-1][4] - S[-1][2] = 30 - 14 = 16
이것을 수행하기 위한 코드는 아래와 같다.
A = int(input())
max_result = 0
for i in range(len(S[-1]) - A):
result = S[-1][i + A] - S[-1][i]
max_result = max(result, max_result)
이 과정을 수행하면 최대값을 출력할 수 있다.
<코드>
import sys
input = sys.stdin.readline
N, M = map(int, input().split())
clap = [[0] * (M + 1)]
S = [[0] * (M + 1) for _ in range(N + 1)]
for i in range(N):
clap_row = [0] + list(map(int, input().split()))
clap.append(clap_row)
for i in range(1, N + 1):
for j in range(1, M + 1):
S[i][j] = S[i - 1][j] + S[i][j - 1] - S[i - 1][j - 1] + clap[i][j]
A = int(input())
max_result = 0
for i in range(len(S[-1]) - A):
result = S[-1][i + A] - S[-1][i]
max_result = max(result, max_result)
print(max_result)
반응형
'ALGORITHM > PYTHON' 카테고리의 다른 글
백준 BAEKJOON 32775번 가희와 4시간의 벽 1 [PYTHON/파이썬] (0) | 2025.01.15 |
---|---|
백준 BAEKJOON 32710번 구구단표 [PYTHON/파이썬] (0) | 2025.01.12 |
백준 BAEKJOON 32684번 장기 [PYTHON/파이썬] (2) | 2025.01.03 |
백준 BAEKJOON 1919번 애너그램 만들기 [PYTHON/파이썬] (1) | 2024.12.28 |
백준 BAEKJOON 1592번 영식이와 친구들 [PYTHON/파이썬] (1) | 2024.12.20 |