자료구조와 함께 배우는 알고리즘 입문 [파이썬] - 2장. 기본 자료구조와 배열

youngtae·2023년 3월 25일
0
post-thumbnail

2-1. 자료구조와 배열

배열: 묶음 단위로 값 저장

객체 하나하나를 원소, 각 원소는 인덱스 부여받음
서로 다른 자료형 같이 저장 가능

  • 리스트와 튜플은 데이터 컨테이너라고 함

    리스트는 원소 변경할 수 있는 뮤터블 객체
    원소값 없는 none리스트 생성 가능 ex) [None]*5

  • 튜플은 원소 변경할 수 없는 이뮤터블 자료형

    원소 하나면 뒤에 쉼표 붙이기
    ( )로 둘러쌈, 생략가능

  • 원소값들을 풀어 여러 변수에 대입하는 것을 언팩
    x = [1,2,3]
    a, b, c = x
    a, b, c # (1,2,3)
  • 슬라이싱:
    • s[i : j : k] = s[i]부터 s[j]까지 k씩 건너뛰며 나열, k 생략 가능
    • s[::-1] 역순으로 출력 💡 s[3:1] -> 오류 나지 않음
      범위가 len(s)보다 크면 len(s)로 간주
  • 자료구조는 논리적인 관계로 이루어진 데이터 구성, 데이터가 모여있는 구조

  • if x: x가 비어있지 않으면 True, else: x가 비어있으면 False

  • 배열끼리 대소, 등가 판단

    • 맨 앞 원소부터 차례로 비교하면서 원소의 값이 같으면 다음 원소 비교
    • 원소 수 다르면 더 많은 배열이 크다고 판단
    • 등가성 비교: ==으로 판단, 좌변 우변 값이 같은지
    • 동일성 비교: is로 판단, 값은 물론 식별 번호까지 같은지
    • 내포 표기 생성: for, if 문 사용하여 새로운 리스트 생성하는 기법
      twise = [num * 2 for in numbers if num % 2 == 1]
      리스트는 가능 튜플은 불가능

2-2. 배열이란

  • from typing import Any, Sequence
    Any는 제약이 없는 임의의 자료형, Sequence는 시퀀스형(리스트, 튜플, 문자열)

  • def max_of(a: Sequence) - > Any:
    건네받은 매개변수 a의 자료형은 Sequence입니다
    반환하는 것은 임의의 자료형 Any입니다

  • __name__ 은 모듈 이름을 나타내는 변수

    • 스크립트가 직접 실행될 때 변수 __name__‘__main__’
    • 스크립트가 임포트될 때 변수 __name__은 원래의 모듈 이름
    • 파이썬에서는 모듈도 객체
    • 모듈은 처음 임포트 되는 시점에 그 모듈 객체가 생성되면서 초기화 되는 구조
  • enumerate(x) : 0부터 인덱스 카운트

 for i, idx in enumerate(list):
 값과 인덱스를 동시에 사용 가능
  • 자료형 객체는 모두 이터러블(반복가능)
  • 이터러블 객체는 원소를 하나씩 꺼내는 구조
  • 내장함수 iter()의 인수로 전달하면 그 객체에 대한 이터레이터(반복자) 반복
  • 기수 변환하기
def card_conv(x, r):

	d = '' # 변환 후 문자열
	dchar = '0123456789ABCDEFGHIJKLMN'

	while x > 0:
		d += dchar[x % r] # 나머지값의 인덱스에 해당하는 문자 추가
		x //= r # x 는 x // r

	return d[::-1] # 역순으로 반환
  • 소수판별 알고리즘
# 소수 판별 알고리즘
num = 0 # 찾은 소수 개수
sosu = [None] * 500 # 소수 리스트

sosu[num] = 2 # 리스트 첫번째에 2 저장
num += 1
sosu[num] = 3 # 리스트 두번째에 3 저장
num += 1

for n in range(5, 1001, 2): # 홀수만 대상으로 반복
	i = 1
	while sosu[i] * sosu[i] <= n:
		if n % sosu[i] == 0: # 찾은 소수로 나누어 떨어지면 소수 아니므로 종료
			break
		i += 1
	
	else: # 나누어 떨어지지 않으면
		sosu[num] = n # 소수이다
		num += 1

print(sosu)
  • 리스트 복사할때 copy() 하면 처음 리스트의 원소값 변경해도 같이 바뀐다.
    참조하는 곳까지 복사되는 얕은복사
  • 참조하는 곳 다르게 하려면 깊은 복사 deepcopy() 해야 된다 (import copy 필요)
profile
나의 개발기록

0개의 댓글