이 문제는 100X100의 2차원 배열을 주고 그 2차원 배열의 가로, 세로, 대각선을 모두 더했을때 가장 큰 값을 출력해야 하는 문제이다.
따라서 완전탐색을 진행하고자 했다.
가로의 합과 같은 경우에는 입력을 받고 바로 파이썬 내장함수 sum을 통해 라인을 더한 값을 result와 비교하여 최댓값을 result에 갱신하는 형태로 진행하면 된다.
for i in range(100):
line = list(map(int, input().split()))
result = max(result, sum(line)) # 가로의 합
세로의 합은 각 라인을 입력받았을 때 세로의 합을 저장하는 100길이의 배열을 선언하고 이를 더하면서 진행한다. 그렇게 되면 100개의 pan에 세로의 합이 모두 담기게 될 것이고 이들 중 가장 큰 값과 result를 비교하면 된다.
pan = [0 for i in range(100)] # 세로의 합을 저장할 배열
for i in range(100):
line = list(map(int, input().split()))
result = max(result, sum(line)) # 가로의 합
cnt += line[i] # 아래 오른쪽 대각선의 합을 저장할 cnt
cnt1 += line[99-i] # 아래 왼쪽 대각선의 합을 저장할 cnt1
for j in range(100):
pan[j]+= line[j] # 세로값 저장
대각선의 합 역시 line을 입력받음과 동시에 값을 더하면서 cnt, cnt1에 대각선의 합만 들어가도록 구현한다.
cnt = 0
cnt1 = 0
for i in range(100):
line = list(map(int, input().split()))
result = max(result, sum(line)) # 가로의 합
cnt += line[i] # 아래 오른쪽 대각선의 합을 저장할 cnt
cnt1 += line[99-i] # 아래 왼쪽 대각선의 합을 저장할 cnt1
최종적으로 result에는 가로의 합중 가장 큰 값이 들어가 있고, 이를 세로의 합중 가장 큰 값, 아래 오른쪽 대각선, 아래 왼쪽 대각선과 비교하여 이들 중 가장 큰 값이 전체 최대가 된다.
result = max(result, max(pan), cnt, cnt1) #최댓값
T = 10
for _ in range(10):
test_case = int(input())
result = 0
pan = [[] for i in range(100)]
for i in range(100):
line = list(map(int, input().split()))
result = max(result, sum(line))
for j in range(100):
pan[j].append(line[j])
for i in range(100):
result = max(result, sum(pan[i]))
cnt = 0
cnt1 = 0
for i in range(100):
cnt += pan[i][i]
cnt1 += pan[i][99-i]
result = max(result, cnt, cnt1)
print(f'#{test_case} {result}')
100X100의 메모리를 아꼈고 수행시간에서도 중복을 없앴다.
T = 10
for _ in range(10):
test_case = int(input())
result = 0
pan = [0 for i in range(100)] # 세로의 합을 저장할 배열
cnt = 0
cnt1 = 0
for i in range(100):
line = list(map(int, input().split()))
result = max(result, sum(line)) # 가로의 합
cnt += line[i] # 아래 오른쪽 대각선의 합을 저장할 cnt
cnt1 += line[99-i] # 아래 왼쪽 대각선의 합을 저장할 cnt1
for j in range(100):
pan[j]+= line[j] # 세로값 저장
result = max(result, max(pan), cnt, cnt1) #최댓값
print(f'#{test_case} {result}')