Lumpy Space Princess - Adventure Time
코딩테스트/파이썬 알고리즘 문제풀이 입문

[파이썬 알고리즘 문제풀이 입문] 탐색&시뮬레이션 - 격자판 최대합

yaebb_82 2023. 4. 28.

*문제 본문은 강의 내용과 관련되어 있어 자세하게 적지 않았습니다.

 

 

 

문제

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

 

 

 

풀이

• 내 풀이

import sys
input = sys.stdin.readline

N = int(input())
square = list()
result = list()

for i in range(N):
    square.append(list(map(int, input().split())))

# 열
for i in range(N):
    total = 0
    for j in range(N):
        total += square[j][i]
    result.append(total)

# 행
for i in range(N):
   result.append(sum(square[i]))

# 대각선
left = right = 0
for i in range(N):
    left += square[i][i]
    right += square[i][(N-1)-i]
result.append(left)
result.append(right)

print(max(result))

• 답안 : Python

import sys
input = sys.stdin.readline

N = int(input())
square = [list(map(int, input().split())) for _ in range(N)]
result = -1e9 #-2147000000으로 해도 됨

# 행, 열
for i in range(N):
    sum1 = sum2 = 0
    for j in range(N):
        sum1 += square[i][j] # 행
        sum2 += square[j][i] # 열
    if sum1 > result:
        result = sum1
    if sum2 > result:
        result = sum2

# 대각선
sum1 = sum2 = 0
for i in range(N):
    sum1 += square[i][i] # 왼쪽 대각선
    sum2 += square[i][(N-1)-i] # 오른쪽 대각선
if sum1 > result:
    result = sum1
if sum2 > result:
    result = sum2

print(result)

• 답안 : Kotlin (내가 바꿔본 것 / 정확X)

import java.io.*
import java.util.*

fun main(args: Array<String>) = with(BufferedReader(InputStreamReader(System.`in`))){
    var N = readLine().toInt()
    var square : MutableList<List<Int>> = mutableListOf()
    var result = -2147000000
    var sum1 = 0
    var sum2 = 0

    for(i in 0 until N) {
        square.add(readLine().split(" ").map{ it.toInt() })
    }

    for(i in 0 until N) {
        sum1 = 0
        sum2 = 0
        for(j in 0 until N) {
            sum1 += square[i][j]
            sum2 += square[j][i]
        }
        if(sum1 > result) result = sum1
        if(sum2 > result) result = sum2
    }

    sum1 = 0
    sum2 = 0
    for(i in 0 until N) {
        sum1 += square[i][i]
        sum2 += square[i][N-1-i]
    }
    if(sum1 > result) result = sum1
    if(sum2 > result) result = sum2

    println(result)
}

- 최종 최댓값을 구하는 방법을 나는 리스트를 활용해서 구했고, 답안은 변수만을 활용해서 구했다.

- 또한, 나는 행/열/대각선 에 해당하는 로직을 각각 구현 했다면, 답안에서는 행열/대각선 으로 묶어서 for문의 개수를 줄이는 방식으로 구현했다.

- 리스트와 for문을 불필요하게 많이 생성하는 것은 좋지 않다는 것을 알게 되었다.

 

 

 

반응형

댓글