728x90
2차원 배열
- 1차원 list를 묶어놓은 list
- 세로 길이(행의 개수) = N, 가로 길이(열의 개수) = M 일때 2차원 배열 만들기
arr = [[0] * M for _ in range(N)]
# 아래와 같은 경우는 안됨!!
# 모든 행이 같은 1차원 리스트를 참조하고 있기 때문
arr = [[0]*M]*N
배열 순회
- i : 행의 좌표, j : 열의 좌표
- 행 우선 순회
for i in range(len(Array)): for j in range(len(Array[i])): Array[i][j]
- 열 우선 순회
for j in range(len(Array[0])): for i in range(len(Array)): Array[i][j]
- 지그재그 순회
for i in range(len(Array)): for j in range(len(Array[i])): Array[i][j + (M-1-2*j) * (i%2)]
델타를 이용한 2차원 배열 탐색
# N*M 배열
# 좌, 우, 상, 하
di = [0, 0, -1, 1]
dj = [-1, 1, 0, 0]
for i in range(len(arr)):
for j in range(len(arr[x])):
for k in range(4):
test_i = i + di[k]
test_j = j + dj[k]
if 0<= test_i < N and 0 <= test_j < M:
arr[test_i][test_j]
전치 행렬
- 대각선 기준 대칭이 되게 자리를 바꿈
arr = [[1,2,3],[4,5,6],[7,8,9]]
for i in range(3):
for j in range(3):
# 모든 원소에 대해서 바꾸는 작업을 진행하면 2번 반복하여 원래 자리로 돌아오게 되므로
# 대각선을 기준으로 위나 아래에서 한 번만 바꾸는 작업을 진행
if i < j: arr[i][j], arr[j][i] = arr[j][i], arr[i][j]
부분집합 (Subset)
- 부분집합의 수
- 집합의 원소가 n개일 때, 공집합을 포함한 부분집합의 수는 2^n개
- 각 원소를 부분집합에 포함 시키거나 포함 시키지 않는 2가지 경우를 모든 원소에 적용한 경우의 수
- 각 원소가 부분집합에 포함되었는지를 loop 이용하여 확인하고 부분집합 생성
bit = [0,0,0,0] for i in range(2): bit[0] = i for j in range(2): bit[1] = j for k in range(2): bit[2] = k for l in range(2): bit[3] = l print(bit)
- 비트 연산자 사용
arr = [3,6,7,1,5,4] n = len(arr) for i in range(1<<n): # 1<<n : 부분 집합 개수(1=2^0 -> 비트 단위로 n이동 -> 2^n) for j in range(n): # 원소의 수만큼 비트를 비교 if i & (1<<j): # i의 j번째 비트가 1이면 j번째 원소 출력 print(arr[j], end=', ') print() print()
- itertools 모듈 사용
from itertools import combinations arr = [1, 2, 3, 4] n = len(arr) for r in range(n+1) : for combo in combinations(arr, r): print(combo) print()
728x90
'PROGRAMMING > PYTHON' 카테고리의 다른 글
[Python] 진수 변환 (0) | 2021.10.03 |
---|---|
[Python] 비트 연산자 (0) | 2021.08.22 |
[Python] packing과 unpacking (0) | 2021.08.16 |
[Python] input() vs sys.stdin.readline() (0) | 2021.08.16 |
[Python] 객체 지향 프로그래밍(OOP) (0) | 2021.07.30 |
댓글