본문 바로가기

프로그래머, 보안 관련 지식/자료구조 익숙해지기 (with python)

자료구조 : Array in python

앞서 자료구조에서 배웠듯이 array 즉 배열은 같은 type의 데이터를 순서대로 나열한 자료구조이다.

 

파이썬에서의 배열 사용은 다른 언어들에 비해 매우 간단한 편이다. 

 

먼저 배열의 이름을 설정하고 나열하고자 하는 데이터를 보통 리스트의 형태( [ ] 로 묶어서 ) 로 나타낸다.

배열의 타입이나 크기를 설정해줘야하는 c언어에 비해 간단하게 배열을 표현할 수 있다.

 

1
2
data = [1,2,3,4,5]
char = ['a','b','c']

 

 

이런 식으로 말이다. 각각의 요소는 인덱스를 통해서 접근이 가능하다. ( ex) data[0] = 1, char[2] = 'c') 인덱스는 0부터 시작하게 되어 가장 큰 인덱스는 (배열 요소의 개수 - 1) 가 된다.

 

가장 간단한 사용법인 배열이지만 이러한 배열의 성질을 잘 활용할 줄 알아야 어려운 문제 풀이나 프로그램의 길잡이가 될 것이다. 데이터가 담긴 배열을 수정하거나 자르거나 조건을 붙여서 필터링 한다거나 등을 할 수 있어야 한다.

 

for 문을 통해서 배열을 다음과 같이 출력할 수 있다.

 

1
2
3
4
for i in range(0len(data)):
    print(data[i])
 
 

 

   i 는 data의 인덱스에 접근하기 위해 선언하였으며 range 함수에 의해 반복문을 돌면서 0부터 len(data) - 1 까지 점점 1씩 증가하게 된다. 

   len(data)는 data의 요소의 개수를 반환한다. 따라서 위에서 말했던 인덱스의 범위 = (배열의 요소의 개수 -1)

을 이용한 것이다. 반복문을 돌면서 data의 요소들을 출력하는 결과가 나올것이다.

 

<결과>

    

1

2

3

4

 

또한 이런식으로 출력도 가능하다.   

1
2
for item in data:
    print(item)
cs

item 은 data의 요소를 가리키게 된다. 이런식으로 쓰면 알아서 처음 인덱스 부터 끝까지 하나씩 요소를 출력할 수 있다.

(range , for 문 참고 : https://wikidocs.net/22 )

 

2차원 배열은 다음과 같이 나타낼 수 있다.

1
data_list = [[123], [456], [789]]
cs

이차원 배열의 요소를 인덱스로 다음과 같이 정렬해보자.

    0 1 2

 0 [1,2,3]

 1 [4,5,6]

 2 [7,8,9]

 

data_list[세로][가로] 로 생각해 볼 수 있다.

data_list([1][2]) = 6 , data_list([2][1]) = 8 

 

방대한 데이터를 가진 엄청나게 긴 배열에서 내가 원하고자 하는 값을 찾고 싶을 때는 어떻게 접근해야할까? 

다음과 같은 예제를 알아보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
dataset = ['Braund, Mr. Owen Harris',
'Cumings, Mrs. John Bradley (Florence Briggs Thayer)',
'Heikkinen, Miss. Laina',
'Futrelle, Mrs. Jacques Heath (Lily May Peel)',
'Allen, Mr. William Henry',
'Moran, Mr. James',
'McCarthy, Mr. Timothy J',
'Palsson, Master. Gosta Leonard',
'Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg)',
'Nasser, Mrs. Nicholas (Adele Achem)',
'Sandstrom, Miss. Marguerite Rut',
'Bonnell, Miss. Elizabeth',
'Saundercock, Mr. William Henry',
'Andersson, Mr. Anders Johan',
'Vestrom, Miss. Hulda Amanda Adolfina',
'Hewlett, Mrs. (Mary D Kingcome) ',
'Rice, Master. Eugene',
'Williams, Mr. Charles Eugene',
'Vander Planke, Mrs. Julius (Emelia Maria Vandemoortele)',
'Masselmani, Mrs. Fatima',
'Fynney, Mr. Joseph J',
'Beesley, Mr. Lawrence',
'McGowan, Miss. Anna "Annie"',
'Sloper, Mr. William Thompson',
'Palsson, Miss. Torborg Danira',
'Asplund, Mrs. Carl Oscar (Selma Augusta Emilia Johansson)',
'Emir, Mr. Farred Chehab',
'Fortune, Mr. Charles Alexander',
'Dwyer, Miss. Ellen "Nellie"',
'Todoroff, Mr. Lalio']
 
cs

여기서 내가 이 배열에서 특정 이름을 찾고 싶을때 어떤식으로 찾으면 될까? 예를 들어서

"Allen, Mr. William Henry" 가 있는지 없는지 찾고 싶으면 다음과 같이 코드를 작성해보자.

 

1
2
3
for item in dataset:
    if (item == "Allen, Mr. William Henry"):
        print("찾으려는 이름이 있습니다.")
cs

이 코드를 실행해보면 실제로 dataset에 있는 배열이기 때문에 print구문이 출력될 것이다.

이번에는 좀더 심화로 들어가서 dataset에 특정 글자 대문자 A가 들어간 횟수를 알고 싶으면 어떻게 접근해야할까?

 

참고로 파이썬에서 문자열 자체를 배열형식으로도 접근이 가능하다. 다음과 같은 예제를 보자.

 

1
2
string = 'asdfasdfasdf'
print(string[0])
cs

df다음과 같은 코드를 실행해보면 a가 출력 될 것이다. 문자열의 문자 하나를 배열의 요소로 보고 이런식으로 문자열의 요소만 출력이 가능하다 이를 통해서 A가 들어간 횟수를 알 수 있을 것이다.

 

1
2
3
4
5
6
counter = 0 # 글자 나올 때마다 증가할 횟수의 변수
for strings in dataset:
    for index in range(0 , len(strings)):
        if (strings[index] == 'A'):   
            counter += 1
print(counter)
cs

출력 : 12

의 결과가 나오게 된다. 4번째 줄의 'A' 자리에서 찾고자 하는 문자를 넣으면 원하는 횟수가 출력이 될것이다.

(다만 이 경우 소문자 'a' 는 포함되지 않았다. 'a'를 포함시키려면 조건을 추가해야한다.)

이렇게 배열에 대해 간단하게 연습해보았다. 배열은 앞으로 나올 자료구조에서도 계속해서 등장하게 될 기초 자료구조이다. 다음에는 큐의 자료구조에 대해 연습해보는 시간을 가지겠다.