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문을 이용해서 열을 뽑는 방법이 되게 중요하다
열을 뽑는 방법으로부터 모든 응용이 나오는 것 같다
행과 열을 뒤바꾸는것은 그냥 네 생각대로 그냥 집어넣으면 바뀔 것 같아서 그렇게 해보면 그게 실제로 맞다
'알고리즘 > 알고리즘 일반' 카테고리의 다른 글
2가지 모드로 나누어서 생각하기(코딩테스트 복기) (0) | 2022.04.01 |
---|---|
최소비용으로 목표한 금액을 생산하는 방법은? (0) | 2022.03.14 |
그래프 알고리즘 문제의 기본 스킬1 (0) | 2022.01.26 |
달팽이 배열로 숫자 채워넣기 (0) | 2022.01.23 |
규칙을 찾는 알고리즘 문제 (0) | 2022.01.21 |