서론
오늘은 SW Expert Academy에서 제공하는 "1209. [S/W 문제해결 기본] 2일차 - Sum" 문제를 풀어보았습니다. 이 문제는 2차원 배열에서 각 행의 합, 각 열의 합, 각 대각선의 합 중 최댓값을 구하는 것이 목표입니다.
문제 분석
문제의 요구사항은 다음과 같습니다:
•
100X100 크기의 2차원 배열이 주어집니다.
•
각 행의 합, 각 열의 합, 각 대각선의 합 중 최댓값을 구해야 합니다.
•
총 10개의 테스트 케이스가 주어집니다.
•
배열의 크기는 모든 테스트 케이스에서 동일합니다.
•
각 행의 합은 integer 범위를 넘어가지 않습니다.
•
동일한 최댓값이 있을 경우, 하나의 값만 출력합니다.
문제 해결을 위한 핵심 포인트는 각 행, 열, 대각선의 합을 효율적으로 구하는 것입니다.
계획 수립
문제를 해결하기 위해 다음과 같은 접근 방식을 생각해보았습니다:
•
행, 열 누산 배열을 만들어두고, 각 셀을 돌면서 자신에게 맞는 배열에 누적해주면 될 것 같습니다.
이를 위해 1차원 배열을 사용하여 각 행과 열의 합을 저장하고, 별도의 변수를 사용하여 대각선의 합을 누적하는 방식으로 구현하기로 했습니다.
코드 작성
코드는 다음과 같이 작성하였습니다:
import sys
sys.stdin = open("input.txt", "r")
T = 10
for test_case in range(1, T + 1):
_ = input()
Map = [list(map(int, input().split())) for _ in range(100)]
row_acc = [0] * 100
col_acc = [0] * 100
cross_acc1 = 0
cross_acc2 = 0
# 전부 돌고, 해당하는 행, 열 누적기에 누적
for i, row in enumerate(Map):
for j, cell in enumerate(row):
row_acc[i] += cell
col_acc[j] += cell
if i==j:
cross_acc1 += cell
if (99-i) == j:
cross_acc2 += cell
max_value = max(max(row_acc), max(col_acc), cross_acc1, cross_acc2)
print("#%d %d" % (test_case, max_value))
Python
복사
주요 코드 설명:
•
행과 열의 합을 저장할 1차원 배열 row_acc와 col_acc를 초기화합니다.
•
대각선의 합을 저장할 변수 cross_acc1과 cross_acc2를 초기화합니다.
•
2차원 배열을 순회하면서 각 셀의 값을 해당하는 행, 열, 대각선 누적기에 누적합니다.
•
최종적으로 max() 함수를 사용하여 행, 열, 대각선 합의 최댓값을 구합니다.
문제 해결 및 보완
코드를 작성한 후, 제공된 테스트 케이스를 통해 검증하였습니다. 다행히 한 번에 통과할 수 있었습니다.
회고
오늘의 문제는 비교적 쉽게 해결할 수 있었습니다. 행과 열, 대각선의 합을 구하는 과정을 누적 배열을 활용하여 효율적으로 처리할 수 있었던 것이 핵심이었던 것 같습니다.
이번 문제를 통해 누적 배열의 활용법에 대해 다시 한번 되새길 수 있었습니다. 앞으로도 이러한 테크닉을 잘 활용하여 문제 해결에 적용해봐야겠습니다.