2차원 배열 알고리즘 문제가 나오면 반드시 생각해야하는 스킬들

1. 직사각형에 자연수를 순서대로 집어넣기

 

rows * columns 직사각형에 1,2,3,...을 순서대로 집어넣을려면

 

 

matrix = [ [row * columns + (column+1) for column in range(columns)] for row in range(rows)]

 

rows = 4

columns = 3

matrix = [[row*columns + (columns+1) for column in range(columns)] for row in range(rows)]

print(matrix)

[[1,2,3],[4,5,6],[7,8,9],[10,11,12]]

 

 

2. 직사각형 배열에서 열을 뽑는 방법

 

j+1열을 뽑고 싶으면 [row[j] for row in matrix]

 

j = 2

[row[j] for row in matrix]
[3,6,9,12]

 

for문을 이용한다면 for index, col in enumerate(zip(*matrix)):

 

단골 스킬이라고 볼 수 있다

 

for j,col in enmuerate(zip(*matrix)):
    
    print(f'{j}열: {col}')
    
    
0열: (1,4,7,10)
1열: (2,5,8,11)
2열: (3,6,9,12)

 

3. 직사각형 배열에서 행을 서로 뒤바꾸는 방법

 

행은 인덱싱을 이용해서 matrix[i][~~]같은 식으로 쉽게 뺄수있고

 

원하는 행 위치에다가 바꾸고자하는 다른 행을 그대로 넣으면 바뀐다는거

 

4행 1열부터 2열과 2행 1열부터 2열을 바꾸고 싶다면

 

4행 1열부터 2열을 다른 list 변수에 복사하고

 

4행 1열부터 2열에 2행 1열부터 2열을 집어넣은다음에

 

2행 1열부터 2열에 복사한 list를 집어넣고

 

matrix를 출력해보면 그대로 바뀜

 

r1 = 2
r2 = 4
c1 = 1
c2 = 2

copy_list = matrix[r2-1][c1-1:c2]

copy_list #4행1열부터 2열까지를 복사
[10,11]

matrix[r1-1][c1-1:c2] #2행 1열부터 2열
[4,5]

#4행 1열부터 2열에 2행 1열부터 2열을 집어넣음
matrix[r2-1][c1-1:c2] = matrix[r1-1][c1-1:c2]

#2행 1열부터 2열에 4행 1열부터 2열을 복사한걸 집어넣으면
matrix[r1-1][c1-1:c2] = copy_list

matrix
[[1,2,3],[10,11,6],[7,8,9],[4,5,12]]

 

집어넣는 index에 주의… 파이썬은 0부터 시작하니까

 

 

4. 직사각형 배열에서 열을 바꾸는 방법은?

 

열을 어떻게 바꾸냐가 문제인데 2행부터 4행까지 1열과 3열을 바꾸고 싶다면?

 

for index, row in enumerate(matrix):를 이용해서 matrix에서 행을 하나씩 뽑아

 

2행부터 4행까지 1열과 3열의 원소를 바꾸고 싶으므로

 

if문을 이용해서 index가 2행부터이면

 

1열의 원소를 copy_element로 copy하고

 

1열의 원소에 3열의 원소를 집어넣은다음

 

3열의 원소에 copy한 1열의 원소 copy_element를 집어넣으면

 

하나의 행의 1열과 3열을 바꾼거니까

 

이걸 이제 2행부터 4행까지 수행한다면?

 

r1 = 2
r2 = 4
c1 = 1
c2 = 3

for index, row in enmuerate(matrix):
    
    if index >= r1-1:
        
        copy_element = row[c1-1]
        
        row[c1-1] = row[c2-1]
        
        row[c2-1] = copy_element
        
    if index > r2-1:
        
        break
        
matrix
[[1,2,3],[6,5,4],[9,8,7],[12,11,10]]

 

실제 비교해보면

 

 

2행부터 4행까지 1열 4,7,10이랑 2행부터 4행까지 3열 6,9,12가 서로 뒤바뀜

 

 

5. 되돌아보기

 

for문을 이용해서 열을 뽑는 방법이 되게 중요하다

 

열을 뽑는 방법으로부터 모든 응용이 나오는 것 같다

 

행과 열을 뒤바꾸는것은 그냥 네 생각대로 그냥 집어넣으면 바뀔 것 같아서 그렇게 해보면 그게 실제로 맞다

 

 

TAGS.

Comments