Algorithm

[이론] 이차원 리스트

김디니 2022. 8. 6. 17:14

이차원 리스트란?

  • 리스트를 원소로 가지는 리스트이다.
  • 행렬을 이룰 때 사용한다. 
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

전치란 행렬의 행과 열을 서로 맞바꾸는 것이다.

2d list 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도 회전한다. 

Rotating 2D list

왼쪽으로 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