본문 바로가기

알고리즘 설계/내가 보려고 정리하는 문풀

격자판 최대합

N*N의 격자판이 주어지면 각 행의 합, 각 열의 합, 두 대각선의 합 중 가 장 큰 합을 출력.

첫 줄에 N 주어지고 두번째 줄부터 N개의 행이 주어짐

예시

입력 예시)

5

10 13 10 12 15

12 39 30 23 11

11 25 50 53 15

19 27 29 37 27

19 13 30 13 19

 

출력 예시)

155


내가 쓴 코드1

import sys
sys.stdin = open("input.txt",'rt')

N = int(input())
grid = []
for _ in range(N):
    grid.append(list(map(int, input().split())))

max = 0
tmp = 0

#행의 합 계산
for i in range(N):
    tmp = sum(grid[i])
    if tmp > max:
        max = tmp

#열의 합 계산
for i in range(N):
    tmp = 0
    for j in range(N):
        tmp += grid[i][j]
    if tmp > max:
        max = tmp

#두 대각선 합 계산
tmp = 0
for i in range(N):
    tmp += grid[i][i]
if tmp > max:
    max = tmp

tmp = 0
for i in range(N):
    tmp += grid[i][N-1-i]
if tmp > max:
    max = tmp

print(max)

 

내가 쓴 코드2

import sys
sys.stdin = open("input.txt",'rt')

N = int(input())
grid = []
for _ in range(N):
    grid.append(list(map(int, input().split())))

largest = 0
diagSum1 = 0
diagSum2 = 0
for i in range(N):
    rowSum = 0
    colSum = 0
    for j in range(N):
        rowSum += grid[i][j]
        colSum += grid[j][i]
    diagSum1 += grid[i][i]
    diagSum2 += grid[i][N - 1 - i]
    # if rowSum > largest:
    #     largest = rowSum
    # if colSum > largest:
    #     largest = colSum
# if diagSum1 > largest:
#     largest = diagSum1
# if diagSum2 > largest:
#     largest = diagSum2

lst = [rowSum, colSum, diagSum1, diagSum2]
if max(lst) > largest:
    largest = max(lst)

print(largest)

 

모범 답안

import sys
sys.stdin = open('input.txt', 'rt')

n = int(input())
a=[list(map(int, input().split())) for _ in range(n)]

# for x in a:
#     print(x)

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)

모범답안 보고 느낀점

1. a = [list(map(int, input().split())) for _ in range(n)]를 통해

한 줄로 2차원 격자판 생성 가능

 

2. 각 행을 반복문 돌며 프린트 하는 방법을 통해 쉽게 2차원으로 확인할 수 있음

 

3. 자연수니까 굳이 그럴필욘 없지만.. 가장 작은 값을 초기화할때 -2147000000 이용하자

 

4. 귀찮아서 대충 하지말고 변수명 정할때 변수명 규칙 항상 생각하자~

 

5. 최대한 복잡도를 낮추려고 생각해보자. 특히 시간복잡도에 집중!!. 반복문을 여러번 도는것보다

한번 돌면서 많은걸 하는게 좋겠지

 

6. 2번째는 잘 했는데 모범답안에서 대각선 합은 따로 빼서 다시 돌면서 구하는게 더 맞는걸까?

굳이 다시 써보지는 않겠다!!!

 

'알고리즘 설계 > 내가 보려고 정리하는 문풀' 카테고리의 다른 글

곶감(모래시계)  (2) 2024.10.19
사과나무(다이아몬드)  (1) 2024.10.18
수들의 합  (3) 2024.10.16
두 리스트 합치기  (4) 2024.10.01
카드 역배치  (0) 2024.10.01