코딩테스트/SW Expert Academy

[D3] 1209. [S/W 문제해결 기본] 2일차 - Sum

2024. 10. 16. 10:52

1209. [S/W 문제해결 기본] 2일차 - Sum

 

✏️ 문제 풀이

첫 번째 풀이 

- vertical: 세로 합을 저장하기 위한 리스트로, 크기는 100이며 모든 값 0으로 초기화

- 리스트 컴프리헨션으로 100개의 행을 입력받아 100x100 크기의 행렬을 만듦

for tc in range(1, 11):
	n = int(input())
    result = 0
    vertical = [0] * 100
    right_diagonal = 0
    left_diagonal = 0

	# 100x100 행렬 입력 받기
    matrix = [list(map(int, input().split())) for _ in range(100)]

    for i in range(100):
        result = max(result, sum(matrix[i])) # 가로 합
        for j in range(100):
            vertical[j] += matrix[i][j] # 세로 합

        right_diagonal += matrix[i][i] # 오른쪽 대각선
        left_diagonal += matrix[i][99-i] # 왼쪽 대각선 

    result = max(result, max(vertical), right_diagonal, left_diagonal)

    print(f"#{n} {result}")

 

두 번째 풀이

- 전치행렬(transpose matrix): 행렬의 행과 열을 바꾸는 과정

- zip(): 여러 iterable(반복 가능한 객체)을 동시에 순회하여 각 iterable의 동일한 인덱스에 있는 요소들을 묶어 새로운 튜플 생성
- *matrix는 matrix의 각 행을 개별적인 인자로 풀어주는 역할

→ matrix가 2D 리스트이므로, *matrix는 각 행을 개별적으로 zip()에 전달

for tc in range(1, 11):
    n = int(input())  
    result = 0
    right_diagonal = 0
    left_diagonal = 0

    matrix = []
    
    # 100x100 행렬 입력 받기
    matrix = [list(map(int, input().split())) for _ in range(100)]
    matrix_t = list(zip(*matrix))   # 세로 합을 쉽게 계산하기 위해 행렬 전치

    for i in range(100):
        right_diagonal += matrix[i][i]  # 오른쪽 대각선
        left_diagonal += matrix[i][99 - i]  # 왼쪽 대각선
        result = max(result, sum(matrix[i]), sum(matrix_t[i]))  # 가로 및 세로 최대 합 계산

    result = max(result, right_diagonal, left_diagonal)
    print(f"#{n} {result}")