728x90
728x90
문제
N x N 배열 안의 숫자는 해당 영역에 존재하는 파리의 개수를 의미한다.
아래는 N=5 의 예이다.
M x M 크기의 파리채를 한 번 내리쳐 최대한 많은 파리를 죽이고자 한다.
죽은 파리의 개수를 구하라!
예를 들어 M=2 일 경우 위 예제의 정답은 49마리가 된다.
제약 사항
1. N 은 5 이상 15 이하이다.
2. M은 2 이상 N 이하이다.
3. 각 영역의 파리 갯수는 30 이하 이다.
입력
가장 첫 줄에는 테스트 케이스의 개수 T가 주어지고, 그 아래로 각 테스트 케이스가 주어진다.
각 테스트 케이스의 첫 번째 줄에 N 과 M 이 주어지고,
다음 N 줄에 걸쳐 N x N 배열이 주어진다.
출력
출력의 각 줄은 '#t'로 시작하고, 공백을 한 칸 둔 다음 정답을 출력한다.
(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)
예제
[입력] | [출력] |
10 5 2 1 3 3 6 7 8 13 9 12 8 4 16 11 12 6 2 4 1 23 2 9 13 4 7 3 6 3 29 21 26 9 5 8 21 19 8 0 21 19 9 24 2 11 4 24 19 29 1 0 21 19 10 29 6 18 4 3 29 11 15 3 3 29 ... |
#1 49 #2 159 ... |
문제 해결 방법
- 4중 for 문을 이용하여 브루트 포스(Brute Force) 방법대로 풀었다.
max_value = 0
for i in range(N - M + 1):
for j in range(N - M + 1):
sum_area_values = 0
for k in range(M):
for l in range(M):
sum_area_values += matrix[i + k][j + l]
if max_value <= sum_area_values:
max_value = sum_area_values
- 범위를 정확하게 확인하여 프로그래밍하는 연습을 할 수 있는 문제였다.
- 2차원 배열 누적합 알고리즘을 이용하여 풀 수도 있다.
# 누적합 배열 생성
prefix_sum = [[0] * (N + 1) for _ in range(N + 1)]
for i in range(1, N + 1):
for j in range(1, N + 1):
prefix_sum[i][j] = prefix_sum[i - 1][j] + prefix_sum[i][j - 1] - prefix_sum[i - 1][j - 1] + matrix[i - 1][j - 1]
max_value = 0
for i in range(N - M + 1):
for j in range(N - M + 1):
# 영역의 누적합 계산
sum_area_values = prefix_sum[i + M][j + M] - prefix_sum[i][j + M] - prefix_sum[i + M][j] + prefix_sum[i][j]
if max_value < sum_area_values:
max_value = sum_area_values
코드
T = int(input())
for test_case in range(1, 1 + T):
N, M = map(int, input().split())
# 맵 객체를 정수형으로 변환
N = int(N)
M = int(M)
# N x N 리스트를 생성하고 안에 요소 넣기
matrix = []
for i in range(N):
num_list = list(map(int, input().split()))
matrix.append(num_list)
# M x M 크기의 영역으로 N x N 리스트 내부를 순회하면서, 해당 영역 안에 있는 값들의 합의 최댓값 구하기
max_value = 0
for i in range(N - M + 1):
for j in range(N - M + 1):
sum_area_values = 0
for k in range(M):
for l in range(M):
sum_area_values += matrix[i + k][j + l]
if max_value <= sum_area_values:
max_value = sum_area_values
print(f"#{test_case} {max_value}")
참고
- 난이도 : D2
728x90
728x90
'Problem Solving > SWEA' 카테고리의 다른 글
[SWEA-1974][Python] 스도쿠 검증 (0) | 2023.10.16 |
---|---|
[SWEA-1979][Python] 어디에 단어가 들어갈 수 있을까 (1) | 2023.10.14 |
[SWEA-1983][Python] 조교의 성적 매기기 (0) | 2023.10.12 |
[SWEA-1989] 초심자의 회문 검사 (1) | 2023.10.12 |
[SWEA-2005][Python] 파스칼의 삼각형 (0) | 2023.10.12 |
[SWEA-2007][Python] 패턴 마디의 길이 (0) | 2023.10.11 |
[SWEA-1859][Python] 백만 장자 프로젝트 (1) | 2023.10.10 |
[SWEA-2070][Python] 큰 놈, 작은 놈, 같은 놈 (2) | 2023.10.08 |