SWEA 1209. [S/W 문제해결 기본] 2일차 - Sum (Python, 완전탐색, D3)

전승재·2023년 10월 12일
0

알고리즘

목록 보기
58/88

SWEA 1209 SUM 문제 바로가기

문제 접근

이 문제는 100X100의 2차원 배열을 주고 그 2차원 배열의 가로, 세로, 대각선을 모두 더했을때 가장 큰 값을 출력해야 하는 문제이다.
따라서 완전탐색을 진행하고자 했다.

  • 가로의 합
  • 세로의 합
  • 대각선의 합
  • 결과 비교

문제 해결

가로의 합

가로의 합과 같은 경우에는 입력을 받고 바로 파이썬 내장함수 sum을 통해 라인을 더한 값을 result와 비교하여 최댓값을 result에 갱신하는 형태로 진행하면 된다.

for i in range(100):
        line = list(map(int, input().split()))
        result = max(result, sum(line)) # 가로의 합

세로의 합

세로의 합은 각 라인을 입력받았을 때 세로의 합을 저장하는 100길이의 배열을 선언하고 이를 더하면서 진행한다. 그렇게 되면 100개의 pan에 세로의 합이 모두 담기게 될 것이고 이들 중 가장 큰 값과 result를 비교하면 된다.

pan = [0 for i in range(100)] # 세로의 합을 저장할 배열
for i in range(100):
        line = list(map(int, input().split()))
        result = max(result, sum(line)) # 가로의 합
        cnt += line[i] # 아래 오른쪽 대각선의 합을 저장할 cnt
        cnt1 += line[99-i] # 아래 왼쪽 대각선의 합을 저장할 cnt1
        for j in range(100):
            pan[j]+= line[j] # 세로값 저장

대각선의 합

대각선의 합 역시 line을 입력받음과 동시에 값을 더하면서 cnt, cnt1에 대각선의 합만 들어가도록 구현한다.

cnt = 0 
cnt1 = 0 
for i in range(100):
        line = list(map(int, input().split()))
        result = max(result, sum(line)) # 가로의 합
        cnt += line[i] # 아래 오른쪽 대각선의 합을 저장할 cnt
        cnt1 += line[99-i] # 아래 왼쪽 대각선의 합을 저장할 cnt1

결과 비교

최종적으로 result에는 가로의 합중 가장 큰 값이 들어가 있고, 이를 세로의 합중 가장 큰 값, 아래 오른쪽 대각선, 아래 왼쪽 대각선과 비교하여 이들 중 가장 큰 값이 전체 최대가 된다.

result = max(result, max(pan), cnt, cnt1) #최댓값 

제출 코드

처음 짠 코드

T = 10
for _ in range(10):
    test_case = int(input())
    result = 0
    pan = [[] for i in range(100)]
    for i in range(100):
        line = list(map(int, input().split()))
        result = max(result, sum(line))
        for j in range(100):
            pan[j].append(line[j])
    for i in range(100):
        result = max(result, sum(pan[i]))
    cnt = 0
    cnt1 = 0
    for i in range(100):
        cnt += pan[i][i]
        cnt1 += pan[i][99-i]
    result = max(result, cnt, cnt1)
    print(f'#{test_case} {result}')

조금 더 생각한 코드

100X100의 메모리를 아꼈고 수행시간에서도 중복을 없앴다.

T = 10
for _ in range(10):
    test_case = int(input())
    result = 0
    pan = [0 for i in range(100)] # 세로의 합을 저장할 배열
    cnt = 0 
    cnt1 = 0 
    for i in range(100):
        line = list(map(int, input().split()))
        result = max(result, sum(line)) # 가로의 합
        cnt += line[i] # 아래 오른쪽 대각선의 합을 저장할 cnt
        cnt1 += line[99-i] # 아래 왼쪽 대각선의 합을 저장할 cnt1
        for j in range(100):
            pan[j]+= line[j] # 세로값 저장
    
    result = max(result, max(pan), cnt, cnt1) #최댓값 
    print(f'#{test_case} {result}')

0개의 댓글