2D Array 라니 전혀 감이 잡히지가 않았지만 그냥 위치적인 특징을 가지고 풀어버렸다. 나의 답이 출제자의 의도에 맞는지는 언제나 의문이다.
문제 해석
Task
- 6X6의 숫자들이 행렬처럼 나열된 A에서 모래시계 모양으로 떨어지는 숫자열을 모래시계(Hourglass)라고 한다.
- 16개의 모래시계들이 있는데 그 모래시계 모양에 겹쳐지는 숫자들의 합 중 가장 큰 값을 내놔라.
Input Format
- 6줄의 input이 입력될 것이며, 각 줄은 사이사이에 공백이 있는 6개의 정수이다.
Output Format
- 모래시계 모양에 겹쳐지는 합 중 가장 큰 수
문제 풀이
주어진 코드 해석하기
- 이번에도 많은 것들이 import되지만 난 사용하지 않는다… 대체 저걸 어떻게 사용해서 답을 풀어야하는지가 더 고민이다. (아니면 나도모르게 사용하고 있는 모듈인것인가…
1
2
3
4
5
6
7
8
9
10
11import math
import os
import random
import re
import sys
if __name__ == '__main__':
arr = []
for _ in range(6):
arr.append(list(map(int, input().rstrip().split())))- 빈 리스트가 arr라는 변수에 할당되고, for문을 통해 input이 6번 arr에 append된다.
- 각 input은
rstrip()
메소드를 통해 공백이 제거되고, 각 문자는split()
메소드를 통해 리스트의 한 요소가 된다. - 그 리스트는
map()
함수에 들어간int()
함수로 인해 요소가 하나씩 정수로 type casting된 map객체가 되고 다시 list로 type casting된다. - 그 리스트가 arr라는 변수에 6번 쌓인다.
문제 해결하기
일단 arr를 출력해보니 다음과 같이 나온다.
1
2print(arr)
# [[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]]- input format의 각 줄이 리스트로 묶인 6개의 요소로 구성되어있다.
이제 모래시계 모양의 위치에 떨어지는 요소들을 인덱스값으로 호출해서 묶어주면 되겠다.
- 첫번째 모래시계를 예로 들자면, arr[0]의 0,1,2번째, arr[1]의 1번째, arr[2]의 0,1,2번째 요소들로 구성되어 있을 것이다.
- 두번째 모래시계는 arr[0]의 1,2,3번째, arr[1]의 2번째, arr[2]의 1,2,3번째
- 즉 arr[i]의 j, j+1, j+2번째와 arr[i+1]의 j+1번째, 그리고 arr[i]의 j, j+1, j+2번째을 모래시계의 요소들이라고 볼 수 있다.
- 이렇게 쭉쭉 가다가 arr[0]의 6번째라거나 arr[6]이라는 요소는 없는 값이므로 (arr와 그 속의 리스트는 둘다 0~5까지만 인덱스값을 가진다) 호출할 수 있는 최대 인덱스 값은 (+2 하는것까지 고려하면) 3이다.
이제 0부터 3까지의 i와 j를 for문으로 돌리면서 모래시계에 위치한 숫자들을 hourglass라는 리스트에 넣어주자.
- range나 슬라이싱 할 때의 끝 기준 인덱스는 항상 +1이 된다는 것을 명심.
*
를 넣어주면 리스트 요소들을 다 풀어서 나열해준다.1
2
3
4
5
6
7
8hourglass_sum = []
for i in range(3+1):
for j in range(3+1):
hourglass = [*arr[i][j:j+2+1], arr[i][j+1], *arr[i][j:j+2+1]]
hourglass_sum.append(sum(hourglass))
print(max(hourglass_sum))hourglass_sum
리스트에 각 모래시계 요소의 합을 더한 값을 넣어주고 그 중 최대값을 출력해주면 끝
느낀 점
math
함수는max()
를 위한 것이라는 걸 나중에야 깨달았다.- 2D라서 for문을 겹쳐서 돌려야한다는 것을 발견한 내가 쪼금 뿌듯
- 처음에 잘 안될 때 그냥 arr부터 print했더니 아주 간단히 뭐가 문제인지 알 수 있었다. 이렇게 그냥 print부터 해보는 것도 좋은 것 같다.