N*N의 격자판이 주어지면 각 행의 합, 각 열의 합, 두 대각선의 합 중 가장 큰 합을 출력합니다.
<내 답안1>
n = int(input())
pan = []
for _ in range(n):
list1 = list(map(int, input().split()))
pan.append(list1)
# 행의 합 중에 최대값
max1 = 0
for i in range(n):
sum1 = 0
for j in pan[i]:
sum1 += j
if sum1 > max1:
max1 = sum1
# 열의 합 중에 최대값
max2 = 0
for i in range(n):
sum2 = 0
for j in range(n):
sum2 += pan[j][i]
if sum2 > max2:
max2 = sum2
# 왼->오 대각선
sum3 = 0
for i in range(n):
sum3 += pan[i][i]
# 오->왼 대각선
sum4 = 0
for i in range(n):
sum4 += pan[i][(n-1)-i]
print(max(max1, max2, sum3, sum4))
해설 듣다가 깨달은건데 행, 열, 대각선 각각에 max 변수가 필요 없었다. 어차피 최대값을 구하는 거니까 변수 max1 하나만 사용하면 된거였다. 그리고 마지막에 그냥 max1 출력하면 된다!
그래서 이렇게 고쳤다.
<내 답안2>
n = int(input())
pan = []
for _ in range(n):
list1 = list(map(int, input().split()))
pan.append(list1)
# 행의 합 중에 최대값
max1 = 0
for i in range(n):
sum1 = 0
for j in pan[i]:
sum1 += j
if sum1 > max1:
max1 = sum1
# 열의 합 중에 최대값
for i in range(n):
sum2 = 0
for j in range(n):
sum2 += pan[j][i]
if sum2 > max1:
max1 = sum2
# 왼->오 대각선
sum3 = 0
for i in range(n):
sum3 += pan[i][i]
if sum3 > max1:
max1 = sum3
# 오->왼 대각선
sum4 = 0
for i in range(n):
sum4 += pan[i][(n-1)-i]
if sum4 > max1:
max1 = sum4
print(max1)
시간초과도 나지 않아서 나름 잘 풀었다고 생각했지만 해설을 보니 더 효율적으로 잘 짜여있었다..
나는 행, 열, 왼쪽 대각선, 오른쪽 대각선 으로 크게 네 번 나눠서 풀었는데 해설에서는 행과 열, 두 대각선 으로 크게 두 번 나누었다.
그렇구나.. 나는 또.. 비효율적인 코드를 짠거구나..
<모범답안>
n = int(input())
a = [list(map(int, input().split())) for _ in range(n)]
largest = -2147000000 # 가장 작은 값
# 행과 열 최대값
for i in range(n):
sum1=sum2=0
for j in range(n):
sum1+=a[i][j] # 행 고정 열 반복
sum2+=a[j][i] # 열 고정 행 반복
if sum1 > largest:
largest = sum1
if sum2 > largest:
largest = sum2
# 대각선
sum1=sum2=0
for i in range(n):
sum1+=a[i][i]
sum2+=a[i][(n-1)-i]
if sum1 > largest:
largest = sum1
if sum2 > largest:
largest = sum2
print(largest)
또한 나는 이차원 리스트 만들기 위해 리스트 2개가 필요했는데 모범답안에서는 리스트 하나로도 모자라 한 문장으로도 코드가 가능했다.
a = [list(map(int, input().split())) for _ in range(n)]
이 문장은 진짜 신선하다!! 이렇게도 되구나!
해설을 들으며 새로 알게되는 신선한 코드들에 늘 감탄하지만 내가 직접 내꺼로 만들고 써먹을 수 있었으면 좋겠다.. 감탄만 하지마 제발ㄹ..