본문 바로가기
IT/[Everyday]Coding

컵 모양의 2차 행렬의 모든 합이 가장 큰 것을 알아내라

by Jang HyunWoong 2016. 8. 16.

컵 모양의 2차 행렬의 모든 합이 가장 큰 것을 알아내라.


Context 

Given a  2D Array:

1 1 1 0 0 0
0 1 0 0 0 0
1 1 1 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0

위와 같이 6x6 2차 행렬에서 

a b c
  d
e f g

컵모양 위치의 행렬 값들을 더해서 가장 큰 값을 알아 내는 것이다. 


Constraints

예를들어, 

Sample Input

1 1 1 0 0 0
0 1 0 0 0 0
1 1 1 0 0 0
0 0 2 4 4 0
0 0 0 2 0 0
0 0 1 2 4 0

Sample Output 출력값

19


파이썬3로 해봤다. 



#!/bin/python3


import sys


#2차 배열 셋팅

arr = []

for arr_i in range(6):

    arr_t = [int(arr_temp) for arr_temp in input().strip().split(' ')]

    arr.append(arr_t)


#배열 합 더하는 함수 

def conv(y, x, array):

    result = 0

    for i in range(y, y+3):

        for j in range(x, x+3):

            if i == (y+1) and (j == x or j == x+2): #컵모양 때문에 삽입

                continue          

            else:

                result += array[i][j]

    return result


L = []

for i in range(4):

    for j in range(4):

        L.append(conv(i, j, arr))

L.sort(reverse=True)

print(L[0])


/* 생각 */

간단하게 컨볼루션의 기초적인 움직임을 구현할 수 었다. 

9개의 방향으로 컵 모양을 내서 더했지만, 이것을 응용하여 이미지 filter를 만들 수 있겠다는 생각을 했다.

여기에 필터 곱만하면 컨볼루션이 되는 것이다. 

반응형