[Algorithm] 격자판 최대합

myeonji·2022년 1월 20일
0

Algorithm

목록 보기
10/89

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)]

이 문장은 진짜 신선하다!! 이렇게도 되구나!

해설을 들으며 새로 알게되는 신선한 코드들에 늘 감탄하지만 내가 직접 내꺼로 만들고 써먹을 수 있었으면 좋겠다.. 감탄만 하지마 제발ㄹ..

0개의 댓글