알고리즘/Python

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

i'mMolly 2023. 5. 8. 00:08

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=3&contestProbId=AV13_BWKACUCFAYh&categoryId=AV13_BWKACUCFAYh&categoryType=CODE&problemTitle=&orderBy=RECOMMEND_COUNT&selectCodeLang=PYTHON&select-1=3&pageSize=10&pageIndex=1 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

문제

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

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

 

제출 답안

for test_case in range(1, 11):
    num = int(input())
    arr = [list(map(int, input().split())) for _ in range(100)]
    max = 0

    # 가로 탐색
    for i in range(100):
        check = sum(arr[i][0:100])
        if check >= max:
            max = check
    
    # 세로 탐색
    for i in range(100):
        check = 0
        for j in range(100):
            check += arr[j][i]
        if check >= max:
            max = check
    
    # 대각선 탐색1
    check = 0
    for i in range(100):
        check += arr[i][i]
    if check >= max:
            max = check

    # 대각선 탐색2
    check = 0
    for i in range(100):
        check += arr[i][99-i]
    if check >= max:
            max = check

    print(f"#{test_case} {max}")

 

개선 답안1

for문 한 번으로 대각선 합 두 개 구하기

for _ in range(10) :
    T = int(input())

    array = []
    for i in range(100) :
        array.append(list(map(int, input().split())))

    # 가로줄의 합
    max_1 = 0
    for i in range(100) :
        sum = 0
        for j in range(100) :
            sum += array[i][j]
        if sum > max_1 :
            max_1 = sum

    # 세로줄의 합
    max_2 = 0
    for i in range(100) :
        sum = 0
        for j in range(100) :
            sum += array[j][i]
        if sum > max_2 :
            max_2 = sum

    # 대각선의 합
    max_3 = 0
    for i in range(100) :
        sum1 = 0 ; sum2 = 0
        sum1 += array[i][i]
        sum2 += array[i][99-i]
    if max(sum1, sum2) > max_3 :
        max_3 = max(sum1, sum2)

    print("#{} {}".format(T, max(max_1, max_2, max_3)))

 

개선 답안2

- 100행을 리스트로 읽어 하나씩 방문하며

    - 각 자리의 수는 미리 선언한 배열 인덱스에 맞춰서 더함 (column 배열)

    - 우하향 위치라면 (i == k) 또는 좌하향 위치라면(i + k == 99) 해당 값을 미리선언한 변수에 더함

    - 각 행의 합을 구해서 지금까지 행의 합보다 크다면 결과 값 업데이트

- 최종적으로 구한 모든 수 ( 행 최대 합, 열 최대합, 우하향 합, 좌하향 합) 중 가장 큰 수를 출력

for test in range(1, 11):
    n = int(input())  # test no.
    result = 0
    column = [0]*100  # 각 열의 총합
    rightDown, leftDown = 0, 0

    for i in range(100):
        line = list(map(int, input().split()))
        for k in range(100):
            if i == k:
                rightDown += line[k]  # 우하향 대각선 합
            if i + k == 99:
                leftDown += line[k]  # 좌하향 대각선 합
            column[k] += line[k]  # 열의 합
        result = max(result, sum(line))  # 지금까지 행의 합 중 가장 큰 수

    result = max(result, max(column), rightDown, leftDown)  # 가장 큰 수 찾기

    print("#{} {}".format(n, result))

 

참고 자료

https://o-sae.tistory.com/31

 

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

문제 링크 : swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV13_BWKACUCFAYh SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com for _ in range(1

o-sae.tistory.com

https://seen-young.tistory.com/54?category=1053952 

 

[SWEA] 파이썬 1209. Sum

~목차~ 문제 문제 해결 포인트 작성 코드 문제 https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=3&contestProbId=AV13_BWKACUCFAYh&categoryId=AV13_BWKACUCFAYh&categoryType=CODE&problemTitle=&orderBy=RECOMMEND_COUNT&se

seen-young.tistory.com