CS 벼락치기 - 행렬

2022-06-13

행렬이 뭐죠..?

물론 행렬은 선형대수에 있어서 매우 중요하지만 지금같은 그냥 프로그래밍에선 이차원 리스트로 생각하면 된다. A=[100010001]A = \begin{bmatrix} 1 & 0 & 0\\ 0 & 1 & 0\\ 0 & 0 & 1\\ \end{bmatrix}은 A = [[1,0,0],[0,1,0], [0,0,1]]로 표현된다. 일차원이 행, 이차원이 행에 딸린 열을 표현하는 용이라고 생각하자.

상위/하위 삼각행렬의 합

말 그대로 주대각선을 기준으로 위에 있는, 그리고 아래에 있는 원소들을 모아놓은 삼각행렬이다. CS에선 이들 원소들의 합을 구하는 것을 다룬다. 아래 그림에서 색칠된 부분 중 위 부분이 상위삼각, 아래 부분이 하위삼각행렬이다. 인덱스를 써놨는데, 상위삼각은 i<ji<j인 원소들이고, 하위삼각은 i>ji>j인 원소들이다. 이 조건을 걸어서 부합하는 원소들을 모두 더해주면 되는 간단한 로직이다.

상/하위 삼각행렬 설명 이미지

상위 삼각행렬에 특정 수를 갖고 대칭인 원소들의 갯수는?

대칭이라는 것은 aij=ajia_{ij} = a_{ji}라는 것이다. 위의 그림에서 생각해보면 당연한 사실이다. 인덱스를 서로 바꿔도 값이 같다면 대칭인 원소일 것이다. 그렇다면 i<ji<j인 원소들 중에서 aij=ajia_{ij} = a_{ji}인 원소를 발견하면 increment를 1씩 증가시켜주면 될 것이다.

두 행렬의 합

두 행렬의 합은 두 행렬의 크기가 같을때 같은 위치의 원소들을 각각 더하는 것으로 정의된다. 따라서 a와 b 두 행렬을 더한 c를 구하려 할때는 cij=aij+bijc_{ij} = a_{ij} + b_{ij}를 이용해 모든 원소에 대해 돌려주면 된다.

두 행렬의 곱

두 행렬의 곱은 다소 복잡하다. a와 b 두행렬을 곱할 때 a의 행 수와 b의 열수가 같아야 행렬곱 연산이 가능하다. a의 행과 b의 열을 갖고 연산하게 되는데, 이때 a의 행첨자용 i와 열첨자용 j뿐 아니라 b의 열첨자를 하나씩 증가시키는 용도로 k라는 변수를 지정해 cik=aijbjkc_{ik}=a_{ij} * b_{jk}로 연산되게 했다.