학습 기록/코딩 테스트 기초 이론

파이썬 코딩테스트 준비: 배열

romi__ 2024. 9. 8. 21:24

date/ 24.09.08.

 

 
코딩 테스트 합격자 되기: 파이썬 편
신입 사원 코딩 테스트를 준비하고 계신가요? 코딩 테스트는 문제만 열심히 푼다고 통과할 수 없습니다. 시험은 전략적으로 준비해야 합니다. 《코딩 테스트 합격자 되기》(파이썬 편)은 신입 사원 코딩 테스트 합격에 딱 맞는 빈출문제를 선정하고 풀이하기 위해 저자와 전문 교강사진이 오랜 시간을 들여 고민해 만들었습니다. 문제의 맥을 관통하는 자료구조와 알고리즘, 시간 복잡도 분석까지 완벽하게 풀이했죠! 모든 내용은 친절한 설명에 풍부한 그림을 더해 말끔하게 이해할 수 있도록 했습니다. 코딩 테스트뿐만 아니라 그 다음에 있을 면접까지 대비할 수 있을 것입니다. 이 책과 함께라면 합격은 여러분의 것입니다.
저자
박경록
출판
골든래빗(주)
출판일
2023.11.15

 

'코딩 테스트 합격자 되기: 파이썬 편'을 읽으면서 파이썬을 이용한 코딩 테스트에 도전해보려고 합니다. 기초적인 이론에 대해 공부한 내용을 여기에 기록하고, 실제로 코딩 테스트 문제를 풀며 공부한 내용은 또 다른 카테고리에 기록해 둘 예정입니다. 그러니 틀린 내용이 있다면 댓글로 알려주세요. 코테 고수가 되는 그날까지 화이팅...!

 

배열

개념

 

배열은 인덱스와 값을 1:1로 대응해 관리하는 자료구조입니다. 어떤 위치에 있는 데이터라도 한 번에 접근 가능한 것이 특징입니다. 여기서 인덱스는 0부터 시작함에 유의해야 합니다. 코딩을 처음 접했을 때 상당히 당황스러웠던 기억이 있네요. 대체 왜 첫 번째 데이터를 0번이라고 부르는지... 알 수가 없습니다(

 

배열을 선언하는 방법은 다양합니다.

arr = [0,0,0,0,0,0]
arr = [0] * 6
#위 두 방법은 같은 결과를 갖습니다

 

기초적인 방법

arr = list(range(6))
#[0,1,2,3,4,5]

 

리스트 생성자를 활용하는 방법

arr = [0 for _ in range(6)]
#[0,0,0,0,0,0]

 

리스트 컴프리핸션을 이용하는 방법이 있습니다.

 

 

배열과 차원

차원에 대해서 이야기를 하지 않을 수 없습니다. 2차원 배열 또한 존재하지만 컴퓨터의 세계에서는 1차원만이 이해 가능하므로... 2차원 배열이 저장될 것이라 예상되는 모습과 실제로 저장되는 모습에는 약간의(아니 사실 많은) 차이가 존재합니다.

 

먼저 1차원 배열은 실제 배열의 모습과 동일합니다. 딱히 설명할 게 없죠. 하지만 2차원 배열은 어떨까요?

arr = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
print(arr[2][3]) #12
arr[2][3] = 15 #저장된 값을 변경합니다.
print(arr[2][3]) #15

 

자칫 소위 말하는 '면'의 형태로 데이터가 저장되어 있으리라 생각하기 쉽습니다. 저만 그랬나요..? 큼. 아무튼, 그건 사실이 아니라는 겁니다. 낮은 넘버부터 높은 넘버까지, 1차원 배열의 형태처럼 2차원 배열도 자리합니다. 따라서 접근법에 유의할 필요가 있습니다.

 

리스트 컴프리핸션을 활용해 크기가 3*4인 리스트를 선언해 보겠습니다.

arr = [[i]*4 for i in range(3)]
#[[0,0,0,0],[1,1,1,1],[2,2,2,2]]

 

 

 

배열의 효율성

배열 연산도 시간복잡도가 적용됩니다. (너무 당연한 말) 앞서 언급하였듯 배열은 임의 접근이 가능합니다. 즉, 모든 위치에 한 번에 접근이 가능하다는 말입니다. 따라서 배열 연산의 시간 복잡도는 기본적으로 O(1)입니다. 예를 들어 배열의 맨 뒤에 데이터를 삽입합니다. 그럼 당연히 시간 복잡도가 O(1)이겠죠? 그저 있는 배열에 데이터 하나를 다른 연산 없이 추가만 하면 되는 것이니까요. 데이터가 N개 있는 배열의 맨 앞에 새로운 데이터를 삽입한다면 시간 복잡도가 O(N)입니다. 마찬가지로 중간에 데이터를 삽입하여 밀어야 하는 데이터가 N개라면 시간 복잡도는 O(N)입니다.

 

배열은 하나하나 밀거나 당겨야 한다는 것을 잊지 말아야 합니다. 따라서 임의 접근이 가능한 배열은 데이터를 찾는 데는 효율적이지만 메모리 낭비가 발생할 가능성이 있습니다.

 

 

 

자주 사용하는 리스트 기법

리스트에 데이터 추가

#맨 끝에 append()로 추가
my_list = [1,2,3]
my_list.append(4) #[1,2,3,4]

# +연산자로 맨 끝에 추가
my_list = [1,2,3]
my_list = my_list + [4,5] #[1,2,3,4,5]

#insert()로 삽입
#insert(인덱스, 데이터)
my_list.insert(2, 9999) #[1,2,9999,3,4,5]

 

리스트 데이터 삭제

#pop()으로 특정 위치의 데이터 삭제
#pop(인덱스) -> 삭제한 데이터 반환
my_list = [1,2,3,4,5]
popped_element = my_list.pop(2) #3

#remove()로 특정 데이터 삭제
#위치가 아님에 주의
#중복되는 데이터의 경우 처음으로 등장하는 위치의 데이터 삭제
#remove(데이터)
my_list.remove(2) #[1,3,4,5]

 

리스트 컴프리핸션을 연산에 적용하기

#제곱연산
numbers = [1,2,3,4,5]
squares = [num**2 for num in numbers] #[1,4,9,16,25]
#위의 연산은 연산 대상인 numbers 리스트를 바꾸진 않음

 

 

 

연관된 메서드 몇 가지

len(리스트명) #데이터 개수
index(데이터) #특정 데이터가 처음 등장한 인덱스 출력. 해당 데이터가 존재하지 않으면 -1 출력.
sort(기준) #원본 리스트를 정렬. 기준이 없으면 오름차순, reverse = True면 내림차순 정렬.
count(데이터) #데이터의 개수 반환
set(리스트) #집합 생성 -> 중복값을 허용하지 않음

 

 

/* 사족입니다 */

  • 오랜만에(?) 쓰는 블로그. 금요일은 깃헙 커밋으로 대신했고, 토요일엔 토익을 보고 와서 끝내주는 낮잠을 자느라 발행을 못 했다. 나름 코딩 시작한 이후로 거의 하루도 빼지 않고 전부 발행했는데 그 기록이 깨진 것은 좀 안타깝지만 중요한 것은 발행 수가 아니라 어떤 이유라도 불구하고 하는 성실함 내지 의지이기 때문에... 크게 신경 쓰지 않기로 했다.
  • 시간복잡도 부분은 중요하긴 하지만 재미는 없었는데 본격적으로 코딩테스트에 사용되는 개념을 하나씩 익혀 나가는 파트가 나오니까 훨씬 흥미가 생긴다. 실습 문제도 손코딩으로 풀어보았고, 코테 사이트에서 볼 수 있는 예제들은 조만간 한 문제씩 풀면서 블로그에 어떻게 풀었는지 기록할 생각이다. 수학책과 수학 익힘책의 관계라고 생각... (그리고 수학 익힘책이 최애였던 사람은 싱글벙글입니다)