728x90

지날 글에서는 배열, 정렬, 그리디알고리즘에 대해 가볍게 알아보았다. 알고리즘 사이트들을 통해서 쉬운 문제부터 단계적으로 풀어보며 익숙해지고 있다. 

오늘은 1차원 List를 묶어놓은 List인 2차원 배열에 대해 알아보자.

 

선언
  • 2차원 이상의 다차원 List는 차원에 따라 Index를 선언
  • 2차원 List의 선언: 세로길이(행의 개수), 가로 길이(열의 개수)를 필요로 함
  • Python에서는 데이터 초기화를 통해 변수선언과 초기화가 가능함
arr = [[0,1,2,3],[4,5,6,7]] (2행 4열의 2차원 List)

N = int(input)
arr = [list(map(int, input().split()) for _ in range(N)]

배열 순회
  • n X m 배열의 n*m개의 모든 원소를 빠짐없이 조사하는 방법

1. 행 우선 조회

# i행의 좌표
# j열의 좌표
for i in range(n):
	for j in range(m):
    	Array[i][j] # 필요한 연산 수행

 

2. 열 우선 조회

# i행의 좌표
# j열의 좌표

for j in range(m):
	for i in range(n):
    	Array[i][j] #필요한 연산 수행

 

3. 지그재그 순회

# i행의 좌표
# j열의 좌표

for i in range(n):
	for j in range(m):
    	Array[i][j + (m-1-2*j) * (i%2)]
        # 필요한 연산 수행

 

델타를 이용한 2차 배열 탐색
  • 2차 배열의 한 좌표에서 4차방향의 인접 배열 요소를 탐색하는 방법
  • 상하좌우 인덱스를 이용하는 것!
arr[0...N-1][0...N-1] # NxN 배열
di[] <- [0, 0, -1, 1] #상하좌우
dj[] <- [-1, 1, 0, 0]
for i : 1 -> N-1
	for j : 1 -> N-1:
    	for k in range(4):
        	ni <- i + di[k]
            nj <- j + dj[k]
            if 0 <=ni<N and 0<=nj<N # 유효한 인덱스면
            	test(arr[ni][nj])

 

전치 행렬
#i : 행의 좌표, len(arr)
#j : 열의 좌표, len(arr[0])
arr = [[1,2,3,], [4,5,6], [7,8,9]] # 3*3 행렬

for i in range(3):
	for j in range(3):
    	if i < j:
        	arr[i][j], arr[j][i] = arr[j][i], arr[i][j]

 

2차원 배열을 이용하여 인덱스를 잘 이용한다면 더 좋은 코드를 짤 수 있을거라 생각한다!!

하루에 하나씩이라도 풀어보며 다음 글에서는 부분집합에 대해서 알아보자!!

728x90