배열 또는 순차 리스트는 Index 와 Value 의 쌍으로 구현된 데이터 타입이다. 이러한 배열은 연속적인 메모리 공간 을 차지하기 때문에 저장 공간의 낭비가 발생할 수 있는 단점이 있다.
일차원 배열 구조
우리가 일반적으로 자주 사용하는 일차원 배열 의 구조를 우리눈에 보기 쉽게 그려보자면 아래와 같이 그릴 수 있다.
위에 사진은 우리눈에 보기 쉽게 나타낸 그림이지만 실제 메모리에서는 일차원 배열 은 아래와 같이 저장되어 있다.
이차원 배열 구조
lst = [[val1, val2, val3], [val4, val5, val6]] 와 같은 이차원배열을 우리눈에 보기 쉽게 그려보자면 아래와 같이 그릴 수 있다.
또한 이 이차원배열이 저장된 메모리구조를 보면 아래와 같이 나타낼 수 있다.
배열의 시간복잡도
배열 데이터에 접근할 때는 임의 접근 방법 으로 배열의 모든 위치에 있는 데이터를 한번에 접근할 수 있다. 따라서 데이터에 접근하기 위한 시간 복잡도는 O(1) 이다.
맨 뒤에 값을 삽입
배열의 맨 뒤에 값을 넣는 방법은 기존 데이터들의 위치가 변경되지 않기 때문에 O(1) 의 시간 복잡도를 갖는다.
맨 앞에 값을 삽입
그렇다면 배열의 맨 앞에 값을 넣을떄의 시간복잡도는 어떻게 될까? 결과적으로 O(N) 의 시간복잡도가 걸리게 된다. 왜냐하면 배열은 연속된 메모리구조 를 갖고있기 때문에 배열의 맨앞에 값이 추가되면 기존의 index 들이 하나씩 뒤로 밀리기 때문이다.
Note
새로운 값을 배열의 가운데에 넣어도 똑같다.
배열 정리
Index 로 배열의 값에 접근하는 것은 O(1) 의 시간 복잡도.
배열의 맨 뒤에 새로운 값을 삽입하는 경우에는 O(1) 의 시간 복잡도.
배열의 맨 앞이나 중간에 새로운 값을 삽입하는 경우엔는 O(N) 의 시간 복잡도.
데이터에 자주 접근하거나 값을 읽어야하는 경우에 배열을 사용하면 좋은 성능을 낼 수 있다.
하지만 배려의 마지막 데이터가 아닌 배열 사이의 데이터를 뻇다 추가하는 등의 연산이 많은 경우에는 적합하지 않으며 연결 리스트 가 권장 된다.
연속적인 메모리 공간을 차지하기 때문에 저장공간의 낭비가 발생할 수 있다.
배열 관련 테크닉
1차원 배열
Duplicate 제거
입력값이 모두 숫자인 경우 에는 빈도수를 나타내는 배열을 만들어 중복을 제거할 수 있다.
Note
해당 방법은 배열의 크기를 입력값의 최대값만큼 초기화해야하기 때문에 메모리 낭비가 심하다.
입력값이 모두 문자 혹은 모두 숫자 인 경우에는 입력값을 먼저 정렬해준 후, 이전 index 값과 비교해가며 중복값을 제거할 수 있다.
하지만 입력값의 타입에 상관없이 중복을 제거하는 가장 간단한 방법은 set 를 사용하는 것이다.
Uniq 값 추출
입력값이 모두 숫자일때 앞서 소개한 Duplicate 제거 와 비슷한 방법으로 유일값을 추출할 수 있다.
입력값이 모두 문자 혹은 숫자 + 문자 이면 배열을 사용하지 않고 Dictionary 를 사용하면 된다. 혹은 collections 의 Counter 를 사용할 수 있다.
2차원 배열
각 row 만 순회
정사각형, 직사각형 모두 가능
각 col 만 순회
정사각형, 직사각형 모두 가능
좌에서 우 대각선
정사각형만 가능
우에서 좌 대각선
정사각형만 가능
90 도 회전
정사각형만 가능
180 도 회전
정사각형만 가능
270 도 회전
정사각형만 가능
마름모 순회
정사각형만 가능
version 1
가운데 row 의 합을 초기값으로 세팅하고, 해당 row 를 기준으로 위, 아래를 나누지 않고 한번에 처리할 수 있다.
version 2
정사각형에서 마름모 모양에 포함된 원소들의 인덱스 row, col 은 아래와 같이 나타낼 수 있다.
3 번의 그림은 인덱스 row 와 col 을 row - (전체 row 길이 // 2), col - (전체 col 길이 // 2) 로 나타낸 것이다. 또한, 4번 그림을 통해 마름모 모양에 포함된 원소들의 인덱스 row, col 이 모두 |row| + |col| <= (전체 row 길이 // 2) 를 만족하는 것을 알 수 있다.
알아채기 힘든 규칙들
2차원 배열이 정사각형일때 현재 자신이 위치한 인덱스 row, col 의 합과 자신을 왼쪽하단에서 오른쪽상단으로 가로지르는 원소들의 row, col 의 합이 모두 일정하다. 해당 규칙은 백트래킹 대표 문제 NQueen 에서 사용된다.
2차원 배열이 정사각형일때 현재 자신이 위치한 인덱스 row, col 의 차와 자신을 왼쪽상단에서 오른쪽하단으로 가로지르는 원소들의 row, col 의 차가 모두 일정하다. 해당 규칙도 백트래킹 대표 문제 NQueen 에서 사용된다.