배열

킵고잉·2024년 12월 31일

-1) 배열 개념

배열 : 인덱스와 값을 일대일 대응해 관리하는 자료구조

-> 어떤 위치에 있는 데이터든 한 번에 접근 가능, random access에 유용

배열을 선언하는 방법

  1. 일반적인 방법
# 이름이 arr이고 길이가 6인 정수형 배열
arr=[0,0,0,0,0,0]
arr=[0]*6
  1. 리스트 생성자를 사용하는 방법
arr=list(range(6)) # [0,1,2,3,4,5]

cf) range는 이터레이터로 특정 범위의 정수를 생성하는데 사용

  1. 리스트 컴프리헨션을 활용하는 방법
arr=[0 for _ in range(6)] # [0,0,0,0,0]
  • 배열은 인덱스가 0부터 시작
  • 파이썬에서는 배열을 코드와 함께 설명할 때 리스트를 사용

배열과 차원 : 배열은 차원과는 무관하게 메모리에 연속 할당됨

2차원 배열

# 2차원 배열을 리스트로 표현
arr=[[1,2,3,4],[5,6,7,8],[9,10,11,12]]

# arr[2][3]에 저장된 값 출력
print(arr[2][3]) # 12

# arr[2][3]에 저장된 값을 15로 변경
arr[2][3]=15

# 변경된 값을 출력
print(arr[2][3]) # 15

리스트 컴프리헨션을 활용하여 선언

# 크기가 3*4인 리스트를 선언
arr=[[i]*4 for i in range(3)] # [[0,0,0,0],[1,1,1,1],[2,2,2,2]]

-2) 배열의 효율성

배열은 임의 접근으로 모든 위치에 있는 데이터에 단 한 번에 접근 가능
-> 데이터에 접근하기 위한 시간복잡도는 O(1)

삽입

맨 뒤에 삽입할 경우 O(1)
맨 앞에 삽입할 경우 O(N) - 한 칸씩 밀어야 하니까
중간에 삽입할 경우 O(N) - 뒤에 있는 데이터 개수만큼 밀어야하니까

-> 배열은 특정한 경우에 데이터 추가나 삭제에 드는 비용이 많음

  • 데이터에 빈번하게 접근하는 경우 효율적
  • 메모리 낭비가 발생할 수 있음

배열을 선택할 때 고려할 점

  1. 할당할 수 있는 메모리 크기 확인
    정수형 1차원 배열은 1000만개, 2차원 배열은 3000*3000 크기를 최대로 생각
  2. 중간에 데이터 삽입이 많은지 확인
    중간이나 처음에 데이터 빈번 삽입하면 시간 초과 발생 가능

-3) 자주 활용하는 리스트 기법

리스트에 데이터 추가

  1. append() 메서드 : 리스트의 맨 끝에 데이터 추가
my_list=[1,2,3]
my_list.append(4) # [1,2,3,4]
  1. +연산자 : 리스트의 맨 끝에 다른 리스트의 데이터 추가
my_list=[1,2,3]
my_list=my_list+[4,5] # [1,2,3,4,5]
  1. insert() 메서드 : 특정 위치에 데이터 삽입 (인수: 데이터를 삽입할 위치, 삽입할 데이터)
my_list=[1,2,3,4,5]
my_list.insert(2,9999) # [1,2,9999,3,4,5]

리스트에 데이터 삭제

  1. pop() 메서드 : 특정 위치의 데이터 팝 (인수: 데이터의 인덱스)
my_list=[1,2,3,4,5]
popped_element=my_list.pop(2) # 3
print(my_list) # [1,2,4,5]
  1. remove() 메서드 : 특정 데이터 삭제 (인수: 데이터 값)
    처음 등장하는 위치의 데이터만 삭제
my_list=[1,2,3,2,4,5]
my_list.remove(2) # [1,3,2,4,5]

리스트 컴프리헨션으로 데이터에 특정 연산 적용

리스트 컴프리헨션은 기존 리스트를 기반해 새 리스트를 만들거나 반복문,조건문을 이용해 복잡한 리스트를 생성하는 등 다양한 상황에서 사용할 수 있는 문법
연산이 끝난 리스트를 반환할 뿐이지 연산 대상 리스트를 바꾸지는 않음

numbers=[1,2,3,4,5]
squares=[num**2 for num in numbers] # [1,4,9,16,25]

깨알 같은 리스트 연관 메서드

  • len() 메서드 : 리스트의 전체 데이터 개수 반환
  • index() 메서드 : 특정 데이터가 처음 등장한 인덱스 반환 ( 없으면 -1 반환 )
  • sort() 메서드 : 사용자가 정한 기준에 따라 리스트 데이터 정렬
  • count() 메서드 : 특정 데이터 개수 반환
fruits=["apple","banana","cherry","apple","orange","banana","kiwi"]
len(fruits) # 7
fruits.index("banana") # 1
fruits.sort() # ["apple","apple","banana","banana","cherry","kiwi","orange"]
fruits.sort(reverse=True) # 내림차순
fruits.count("apple") # 2
profile
열심히 하면 되겠지

0개의 댓글