Day 12 - 2D Arrays

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
    11
    import 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
    2
    print(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
      8
      hourglass_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부터 해보는 것도 좋은 것 같다.