이차원 리스트란?
- 리스트를 원소로 가지는 리스트이다.
- 행렬을 이룰 때 사용한다.
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
크게 리스트 안에 3개의 리스트가 포함되어있다.
print(matrix[0])
>>> [1, 2, 3]
print(matrix[1])
>>> [4, 5, 6]
print(matrix[2])
>>> [7, 8, 9]
큰 리스트 안에 3개의 리스트를 출력한다.
print(matrix[0][0])
>>> 1
print(matrix[1][2])
>>> 6
print(matrix[2][0])
>>> 7
두개의 인덱스 위치를 입력하면 리스트 안의 리스트 값을 출력할 수 있다.
matrix = [
[1, 2, 3], # 0
[4, 5, 6], # 1
[7, 8, 9] # 2
]
똑같은 입력값을 행렬의 형태로 표현할 수 있다.
이를 반복문으로 작성해보자.
n = 4 # 행
m = 3 # 렬
matrix = []
for _ in range(n):
matrix.append([0] * m)
print(matrix)
>>> [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
* n == 행(가로)
* m == 렬(세로)
똑같은 코드를 List Comprehension으로 작성해보자.
n = 4 # 행
m = 3 # 렬
matrix = [[0] * m for _ in range(n)]
print(matrix)
>>> [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
'''
1 2 3
4 5 6
7 8 9
'''
matrix = []
for _ in range(3):
line = list(map(int, input().split()))
matrix.append(line)
# comprehension.ver
[list(map(int, input().split())for _ in range(n)]
list comprehension vs. list 곱셈 연산
# list comprehension
from pprint import pprint
n = 5
m = 5
# list comprehension
matrix1 = [[0] * m for _ in range(n)]
>>> [[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]]
# multiply of list
matrix = [[0] * m]
>>> [[0, 0, 0, 0, 0]]
matrix2 = [[0] * m] * n
>>> [[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]]
출력값은 똑같지만, 주소값이 다르다.
matrix1[0][0] = 1
>>> [1, 0], [0, 0] ...
0, 0만 바뀐다.
matrix2[0][0] = 1
>>> [1, 0], [1, 0]...
이와 같이 리스트 곱셈 연산은 다른 행렬에 영향을 미친다.
되도록이면 comprehension을 쓰는 것이 리스트를 다루기에 편하다.
순회
이차원 리스트가 100 X 100 크기 이상일 때 편하게 원소를 출력하기 위해 순회를 사용한다.
이중 for문을 이용한 행 우선 순회
matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8]
[9, 0, 1, 2]
]
for i in range(3):
for j in range(4):
print(matrix[i][j], end=" ") # [j] 고정
print()
>>> 1 2 3 4
>>> 5 6 7 8
>>> 9 0 1 2
for j에서 하나의 행을 출력한다.
이중 for문을 이용한 열 우선 순회
matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8]
[9, 0, 1, 2]
]
for i in range(3):
for j in range(4):
print(matrix[j][i], end=" ") # [i] 고정
print()
>>> 1 5 9
>>> 2 6 0
>>> 3 7 1
>>> 4 8 2
for j에서 하나의 열을 출력한다.
인덱스 조작 없이 리스트로 순회가 가능하다.
matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8]
[9, 0, 1, 2]
]
for row in matrix:
for elem in row:
print(elem, end = ' ')
print()
전체 합 구하기
matrix = [
[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]
]
for i in range(n):
for j in range(m):
total += matrix[i][j]
print(total)
>>> 12
matrix = [
[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]
]
for row in matrix:
for elem in row:
total = sum(elem)
print(total)
for row in matrix:
total += sum(row)
print(total)
matrix안의 리스트 안의 각 리스트를 더하고 더한 값을 총합한다.
Pythonic .ver
matrix = [
[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]
]
total = sum(map(sum, matrix))
print(total)
>>> 12
최대값, 최소값 구하기
# 최대값
matrix = [
[0, 5, 3, 1],
[4, 6, 10, 8],
[9, -1, 1, 5]
]
max_value = 0
for i in range(3):
for j in range(4):
if matrix[i][j] > max_value:
max_value = max[i][j]
print(max_value)
>>> 10
max는 제일 작은 수로 설정해서 더 큰 값이 있으면 비교한 큰 값으로 초기화해준다.
# 최소값
matrix = [
[0, 5, 3, 1],
[4, 6, 10, 8],
[9, -1, 1, 5]
]
min_value = 9999999
for i in range(3):
for j in range(4):
if matrix[i][j] < min_value:
min_value = max[i][j]
print(min_value)
>>> -1
Pythonic .ver
matrix = [
[0, 5, 3, 1],
[4, 6, 10, 8],
[9, -1, 1, 5]
]
max_value = max(map(max, matrix))
min_value = min(map(min, matrix))
print(max_value)
>>> 10
print(min_value)
>>> -1
전치 transpose
전치란 행렬의 행과 열을 서로 맞바꾸는 것이다.
- 예문
matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8]
[9, 0, 1, 2]
]
transposed_matrix = [[0] * 3 for _ in range(4)]
for i in range(4):
for j in range(3):
transposed_matrix[i][j] = matrix[j][i] # 행-열 맞바꾸기
'''
transposed_matrix = [
[1, 5, 9],
[2, 6, 0],
[3, 7, 1],
[4, 8, 2],
]
'''
transposed_matrix = [[0] * 3 for _ in range(4)]
전치 행렬을 담은 이차원 리스트를 초기화한다.
행과 열의 크기가 반대 이므로 4개의 행과 3개의 열을 만들어준다.
transposed_matrix[i][j] = matrix[j][i] # 행-열 맞바꾸기
이 구문을 통해 행과 열을 바꾼다.
회전 Rotating
이차원 리스트를 왼쪽 / 오른쪽으로 90도 회전한다.
왼쪽으로 90도 회전
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
n = 3
rotated_matrix = [[0] * n for _ in range(n)]
for i in range(n):
for j in range(n):
rotated_matrix[i][j] = matrix[j][n-i-1] # => 왼쪽으로 회전
오른쪽으로 90도 회전
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
n = 3
rotated_matrix = [[0] * n for _ in range(n)]
for i in range(n):
for j in range(n):
rotated_matrix[i][j] = matrix[n-i-1][i] # => 오른쪽으로 회전
'Algorithm' 카테고리의 다른 글
그래프(무방향, 유방향) 예문 (0) | 2022.08.09 |
---|---|
백준 1436, 2309, 2798 (0) | 2022.08.08 |
[이론] 힙 Heap, 셋 Set (1) | 2022.08.06 |
[이론] 스택 Stack, 큐 Queue (1) | 2022.08.06 |
백준 1652 누울 자리를 찾아라 (2) | 2022.08.04 |