파이썬 알고리즘 016 | 격자판 최대합

Yunny.Log ·2021년 1월 8일
0

Algorithm

목록 보기
16/318
post-thumbnail

16. 격자판 최대합

5*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

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

▣ 입력설명
첫 줄에 자연수 N이 주어진다.(1<=N<=50)
두 번째 줄부터 N줄에 걸쳐 각 줄에 N개의 자연수가 주어진다. 각 자연수는 100을 넘지 않는
다.

▣ 출력설명
최대합을 출력합니다.

▣ 입력예제 1
5 1
0 13 10 12 15
12 39 30 23 11
11 25 50 53 15
19 27 29 37 27
19 13 30 13 19

▣ 출력예제 1
155

<내 풀이>

  • 음 좀 많이 길다..유형별로 나누어서 풀었더니
group=[]
n=int(input())
for i in range(n) :
    a=list(map(int, input().split()))
    group.extend(a) 
#각 행의 합 : 0-4 . 5-9
one=0
two=n
max=0
while two<=n*n :
    sum=0
    for i in range(one,two):
        sum+=group[i]
    if max<sum:
        max=sum  
    one+=n
    two+=n
#각 열의 합 : 인덱스 5차이 나는 수끼리
one=0
for i in range(n):
    sum=0
    for i in range(one,n*n,n):
        sum+=group[i]
    one+=1  
    if max<sum:
        max=sum
#두 대각선의 합
one=0
for i in range(2):
    sum=0
    for i in range(one,n*n,n+1):
        sum+=group[i]
    one+=n  
    if max<sum:
        max=sum
print(max)

<풀이>

n=int(input())
a=[list(map(int,input().split())) for _ in range(n)] 
largest=0
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)

<다른 분 풀이>

n=int(input())
lst=[[0]*n]*n
for i in range(n):
    lst[i]=list(map(int, input().split()))

tot=0

for i in lst:
    if sum(i)>tot:
        tot=sum(i)

for i in range(len(lst)):
    tmp=0
    for j in range(len(lst)):
        tmp+=lst[j][i]
    if tot<tmp:
        tot=tmp

for i in range(len(lst)):
    tmp=0
    for j in range(len(lst)):
        tmp+=lst[i][n-1-j]
    if tot<tmp:
        tot=tmp
tmp=0
for i in range(n):
    tmp+=lst[i][i]
if tot<tmp:
    tot=tmp

print(tot)

<반성점>

  • 2차원 리스트에 대한 이해 미숙
  • 2차원 리스트 꼭 복습

<배운 점>

  • 리스트 합치는 방법
    (1) +
    (2) extend

  • 2차 리스트 한번에 읽기 *
    (ex)
    5 (=> n
    n, 즉 여기선 5*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

  • 이렇게 되어있는 애를 한번에 읽는 방법

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

[[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]]
이렇게 출력

  • 만약 얘를 2차원 리스트처럼 출력되기를 원한다면
    for x in a:
    print(x) 하면

[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]
이렇게 출력된다

  • 2차원 리스트에서 a[i]a[j] **

for i in range(n):
sum1=sum2=0
for j in range(n):
sum1+=a[i][j](각 열의 합) <i는 고정 j만 이동>
<i가 0일때 j는 1부터n까지..>
sum2+=a[j][i](각 행의 합) <j는 고정 i만 이동>
<j가 0일때 i는 1부터n까지..>

0개의 댓글