ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • section3.6 수들의 합
    알고리즘 2022. 10. 27. 22:09

    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의 격자판이 주어지면 각 행의 합, 각 열의 합, 두 대각선의 합 중 가 장 큰 합을 출력합 니다. 

     

     

    import sys
    sys.stdin = open("input.txt", "rt")
    n = int(input())
    arr = []
    for i in range(n):
        arr.append(list(map(int, input().split())))
    
    def sumHorizon(n):
        sum = 0
        maxSum = 0
    
        for i in range(n):
            for j in range(n):
                sum += arr[i][j]
                if (j == n-1):
                    if maxSum < sum:
                        maxSum = sum
                        sum = 0
                    else:
                        sum = 0
        return maxSum
    
    def sumVertical(n):
        sum = 0
        maxSum = 0
        
        for i in range(n):
            for j in range(n):
                sum += arr[j][i]
                if (j == n-1):
                    if maxSum < sum:
                        maxSum = sum
                        sum = 0
                    else:
                        sum = 0
        return maxSum
    
    def sumDiagonal(n):
        lsum = 0 
        rsum = 0 
        maxSum = 0
        
        for i in range(n):
            lsum += arr[i][i]
            rsum += arr[i][n-i-1]
        
            if (i == n-1):
                    if maxSum < lsum:
                        maxSum = lsum
                        lsum = 0
                    elif maxSum < rsum:
                        maxSum = rsum
                        rsum = 0
                    else:
                        lsum = 0
                        rsum = 0
    
        return maxSum
    
    result = max(sumDiagonal(5), sumVertical(5), sumHorizon(5))
    print(result)
    # print(sumDiagonal(5), sumVertical(5), sumHorizon(5))
    # 155 149 154

     

    각 합마다 함수를 만들어서 코드를 작성했다

    실제 합과 최대를 출력해 보면 답은 맞는데 채점 프로그램에서는 틀린 답으로 나온다...

     

    중간에 잠깐 헷갈려서 함수마다 sum, maxSum의 초기화를 안 했다

    전역 변수라고 생각해서 코드 처음에 초기화만 해 놨더니 오류가 떴다

    마지막에 오류 정리하고 넘어가야겠다

     

    답은 내 코드와 비슷하지만 훨씬 짧았다

    함수를 사용하지 않고 바로 sum을 비교하는 방식

     

    import sys
    sys.stdin = open("input.txt", "rt")
    n = int(input())
    a = [list(map(int, input().split())) for _ in range(n)]
    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-i-1]
        if sum1 > largest:
            largest = sum1
        if sum2 > largest:
            largest = sum2
    print(largest)

     

     

     

     

     

     UnboundLocalError: local variable 'sum' referenced before assignment
    > 함수에서 전역 네임스페이스의 변수를 할당할 일이 생기면 전역변수를 할당 시점에 컴파일러가 로컬변수로 간주하기 때문에 발생하는 오류
    내 코드에서 할당이란? sum을 이용해 계산하는 것, 따라서 함수 안에서 로컬변수가 없기 때문에 오류가 난 것이다

     

    728x90

    '알고리즘' 카테고리의 다른 글

    section3.8 곳감(모래시계)  (0) 2022.10.30
    section3.7 사과나무(다이아몬드)  (0) 2022.10.27
    section3.5 수들의 합  (0) 2022.10.26
    section3.4 두 리스트 합치기  (0) 2022.10.26
    section3.3 카드 역배치  (1) 2022.10.26
Designed by Tistory.