-
Do it! 자료구조와 함께 배우는 알고리즘 입문(파이썬) :: DAY 03 - 1알고리즘 2022. 11. 2. 15:01
ch02. 기본 자료구조와 배열
02-1 자료구조와 배열
배열 (array)
배열 : 묶음 단위로 값을 저장
배열은 객체가 저장되며 배열에 저장된 객체 하나하나를 원소라고 한다
이 원소들은 인덱스를 부여받는다
배열에는 서로 다른 자료형을 같이 저장할 수 있으며, 배열 원소 자체를 배열에 저장할 수 있다
리스트와 튜플
리스트와 튜플은 데이터 컨테이너라고 하며 비슷한 기능을 하지만 원소를 변경할 수 있는지 없는지에 차이가 있다
리스트의 기초
리스트는 원소를 변경할 수 있는 뮤터블 list형 객체이다
연산자 [] 안에 원소를 쉼표로 구분하여 표기
마지막 원소에 , 사용 가능
list = ['A','B', 'C',]
원소 없이 []만 사용하면 빈 리스트 생성
파이썬 내장 함수인 list()를 사용하면 문자열이나 튜플 등 다양한 자료형 객체를 원소로 하는 리스트 생성 가능
list01 = list() list02 = list('ABC') # ['A', 'B', 'C'] 문자열의 각 문자로부터 원소를 생성 list03 = list([1, 2, 3]) list04 = list([1, 2, 3]) # 리스트로부터 원소를 생성 # 리스트, 튜플, 딕셔너리 모두 가능
특정 범위의 정수로 구성된 리스트 만들기 위해서는 range() 사용
list01 = list(range(7)) #[0, 1, 2, 3, 4, 5, 6] list02 = list(range(3, 8)) #[3, 4, 5, 6, 7] list03 = list(range(3, 13, 2)) #[3, 5, 7, 9, 11]
range에서도 step을 설정할 수 있다는 부분이 헷갈렸었다
리스트의 원소 개수는 리스트를 만들기 전에 반드시 결정해야 한다
하지만 원솟값을 정하지 않는 리스트는 None을 사용하면 만들 수 있다
list01 = [None]*5
튜플의 기초
튜플은 원소에 순서를 매겨 결합한 것으로 원소를 변경할 수 없는 이뮤터블 자료형이다
튜플은 원소를 쉼표로 구분하여 나열한 뒤 결합 연산자 ()로 둘러싸는 방식이다
맨 마지막 원소 뒤에 쉼표를 써도 되며, ()만 사용하면 빈 튜플 생성 가능하다
튜플은 리스트와 다르게 연산자 ()를 생략할 수 있다
tuple01 = () # () 빈 튜플 tuple02 = 1, # (1,) tuple03 = (1,) # (1,) tuple04 = 'A', 'B', # ('A', 'B')
tuple02처럼 원소가 1개인 경우 뒤에 반드시 쉼표를 입력해야 하는데 쉼표가 없다면 단순 변수로 여기기 때문이다
튜플도 파이썬 내장 함수인 tupe()을 사용하면 문자열이나 리스트 등 여러 가지 자료형 객체를 원소로 하는 튜플을 생성할 수 있다
tuple01 = tuple() # () 빈 튜플 tuple02 = tuple('ABC') # ('A', 'B', 'C') 문자열의 각 문자로부터 원소 생성 tuple03 = tuple([1, 2, 3]) # (1, 2, 3) 리스트로부터 원소를 생성 tuple04 = tuple({1, 2, 3}) # (1, 2, 3) 집합으로부터 원소를 생성
리스트와 마찬가지로 특정 범위의 값을 원소로 갖는 튜플은 range() 이용
tuple01 = tuple(range(3, 10, 2))
리스트와 튜플 풀어내기
리스트나 튜플의 원솟값들을 풀어 여러 변수에 대입하는 것을 언팩(unpack)이라고 한다
# 리스트 x를 a, b, c에 대입 x = [1, 2, 3] a, b, c = x a, b, c #(1, 2, 3)
슬라이스식으로 원소에 접근
슬라이스 : 리스트 또는 튜플의 원소 일부를 연속해서 또는 일정한 간격으로 꺼내 새로운 리스트 또는 튜플을 만드는 것
s[:] # s의 모든 원소 나열 s[:n] # s의 원소 중 맨 앞에서부터 n개까지 나열 s[i:] # s의 원소 중 s[i]부터 맨 끝까지 나열 s[-n:] # s의 원소 중 맨 끝에서부터 n개까지 나열 s[i:j] # s[i]부터 s[j-1]까지 나열 s[i:j:k] # s[i]부터 s[j-1]까지 k씩 건너뛰며 나열 s[::-1] # s의 원소 중 맨 끝에서부터 전부 출력
슬라이스의 s[i:j:k]에서 i, j, k 정하는 규칙
i, j가 len(s)보다 크면 len(s)가 지정된 것으로 간주한다. 인덱스와 달리 범위가 벗어나는 값을 지정해도 오류 아님
i 가 없거나 none이면 0이 지정된 것으로 간주
j 가 없거나 none이면 len(s)가 지정된 것으로 간주
뮤터블과 이뮤터블의 대입
n = 5 id(n) #140711199888732 n = 'ABC' id(n) #14711199888764
변수에 어떤 값을 대입하면 값이 아니라 식별 번호가 바뀐다(상자가 아니라 그냥 이름 개념)
즉, 어떤 자료형의 객체이든 상관없이 변수에 대입할 수 있다
파이썬은 변수를 선언할 때 자료형을 선언하지 않더라도 변수 이름에 값을 대입하기만 하면 그 이름의 변수를 사용할 수 있도록 자료형을 자동으로 선언해 주는 기능이 있다
어떤 변수에 여러 값을 한꺼번에 대입할 수 있는 기능도 제공
a, b, c = 1, 2, 3
코딩 테스트 준비를 하면서 자바랑 비교했을 때 이 부분이 큰 장점인 것 같다
자바로 코드를 짜다가 파이썬으로 짜면 이 부분에서 크게 어색함이 느껴진다
누적 변수
누적 변수란 변숫값에 특정값을 더한 결괏값을 다시 대입하여 업데이트한 변수
파이썬의 자료형
파이썬의 자료형은 다음과 같이 2가지로 분류한다
뮤터블 자료형 : 리스트, 딕셔너리, 집합 등이 있으며 값을 변경할 수 있다
이뮤터블 자료형 : 수, 문자열, 튜플 등이 있으며 값을 변경할 수 없다
대입 기호 =
대입 기호 = 를 연산식에서 사용하는 +, * 등과 같이 취급하지 않는다
'x + 17' 은 식(statement)이지만 'x = 17' 은 식이 아니라 문(expression)이다
+는 덧셈을 수행하는 연산자이고 =은 연산자가 아니다
c, c++, java에서는 =를 결합 연산자로 사용하기 때문에 a = b = 1이 가능하다
하지만 파이썬에서는 =는 연산자가 아니기 때문에 a= (b=1)을 입력 시 synteaxError: invalid syntax 오류가 발생한다
자료구조의 개념
자료구조(data structure)는 논리적인 관계로 이루어진 데이터 구성
자료구조 : 데이터 단위와 데이터 자체 사이의 물리적 또는 논리적 관계
자료구조를 알아야하는 이유는 컴퓨터에서 처리해야 하는 많은 데이터를 모아 효율적으로 관리하고 구조화하는 데 있다
빈 배열 판단
배열에 원소가 하나도 없는지 확인하고 싶다면 배열을 참조하는 변수를 조건식 그대로 사용
배열이 비어있다면 조건식의 결과는 False
if x: # x가 비어있지 않으면(True) 실해 else: # x가 비어 있으면(False) 실행
등가성과 동일성
파이썬에서 값을 비교할 때 등가성(equality)와 동일성(identity)을 사용한다
등가성 비교는 ==, 동일성 비교는 is
등가성 비교는 좌변과 우변의 값이 같은지 비교, 동일성 비교는 값은 물론 객체의 식별 번호까지 같은지 비교
두 객체의 값이 같은지 비교 : ==
두 객체의 값과 식별 번호가 같은지 비교 : is
내포 표기 생성
리스트 안에서 for, if문을 사용하여 새로운 리스트를 생성하는 기법을 내포 표기 생성이라고 한다
numbers 리스트의 원솟값이 홀수인 경우에 그 원소에 *2를 하여 새 리스트(twise)를 생성한 예시
numbers = [1, 2, 3, 4, 5] twise = [num * 2 for num in number if num % 2 == 1] print(twise) #[2, 6, 10]
728x90'알고리즘' 카테고리의 다른 글
Do it! 자료구조와 함께 배우는 알고리즘 입문(파이썬) :: DAY 03 - 2 (1) 2022.11.02 section3.1 이분 검색 (0) 2022.11.02 Do it! 자료구조와 함께 배우는 알고리즘 입문(파이썬) :: DAY 02 (0) 2022.11.01 Do it! 자료구조와 함께 배우는 알고리즘 입문(파이썬) :: DAY 01 (1) 2022.11.01 section3.11 격자판 회문수 (0) 2022.10.31