[SWEA-d3]1209. Sum - python

iamjinseo·2022년 11월 4일
0

문제풀이-Python

목록 보기
129/134


https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV13_BWKACUCFAYh

문제 설명

다음 100X100의 2차원 배열이 주어질 때, 각 행의 합, 각 열의 합, 각 대각선의 합 중 최댓값을 구하는 프로그램을 작성하여라.

다음과 같은 5X5 배열에서 최댓값은 29이다.

[제약 사항]

총 10개의 테스트 케이스가 주어진다.

배열의 크기는 100X100으로 동일하다.

각 행의 합은 integer 범위를 넘어가지 않는다.

동일한 최댓값이 있을 경우, 하나의 값만 출력한다.

[입력]

각 테스트 케이스의 첫 줄에는 테스트 케이스 번호가 주어지고 그 다음 줄부터는 2차원 배열의 각 행 값이 주어진다.

[출력]

#부호와 함께 테스트 케이스의 번호를 출력하고, 공백 문자 후 테스트 케이스의 답을 출력한다.

풀이

# 각 열의 합은 전치행렬로 만든 후에 구하기
# 대각선 또한 행렬의 대각선과 전치행렬의 대각선으로 구하면 됨
for i in range(1, 11):
  _ = input()
  nums = [list(map(int, input().split())) for _ in range(100)] #배열입력

  # 각 행의 합 중 최대값 
  row_max = 0
  for row in nums:
    row_sum = sum(row) #행 합
    if row_sum > row_max: row_max = row_sum

  # 각 열의 합 중 최대값
  col_max = 0
  for col in zip(*nums):
    col_sum = sum(col) #열 합
    if col_sum > col_max: col_max = col_sum

  # 오른쪽 아래 대각선
  d1_sum = sum([nums[j][j] for j in range(100)])

  # 왼쪽 아래 대각선
  d2_sum = sum([nums[j][99-j] for j in range(100)])

  print(f"#{i} {max(row_max, col_max, d1_sum, d2_sum)}")

결과

남의 코드

for test_case in range(1,11):
    tc=int(input())
    lst=[list(map(int,input().split())) for _ in range(100)]
    ans=v3=v4=0
    for i in range(100):
        v1=v2=0
        for j in range(100): 
            v1+=lst[i][j] # 행 합
            v2+=lst[j][i] # 열 합
        ans=max(ans,v1,v2) 
        v3+=lst[i][i] # 오른쪽 아래 대각선 합
        v4+=lst[i][100-1-i] # 왼쪽 아래 대각선 합
        ans=max(ans,v3,v4)
    print("#%d %d"%(test_case,ans))

엄청 짧고 빨리 하신 분이 있길래 포인트 써서 봤는데 무척 간결하고 가독성도 좋다
나는 행 최대값 계산하고, 열 최대값 계산하고, 대각선 합 계산 두번해서 일일이 다 찾아보는 짓을 선택했는데

이분은 딱 배열을 한 번 탐색해서 모든 값을 다 구했다
wow 👏👏👏👍

profile
일단 뭐라도 해보는 중

0개의 댓글