[TIL/크래프톤 정글9기] 8일차(기본 자료구조와 배열)

blueprint·2025년 5월 18일

크래프톤정글9기

목록 보기
8/55

배열(Array)과 문자열(String)

배열(Array)

  1. 정의
  • 배열은 고정 크기의 요소들을 순차적 나열
  • 데이터 요소들이 연속적인 메모리 블록에 저장
  • 흩어진 변수를 하나로 묶어서 사용 가능

리스트(List)와 튜플(Tuple)

리스트의 기초

  • 리스트는 원소를 변경할 수 있는 뮤터블(mutable) List형 객체
list01 = []                # 빈 리스트
list02 = [1, 2, 3]		   # [1,2,3]
list03 = ['A', 'B', 'C']   # ['A', 'B', 'C'] 

리스트의 원소개수는 리스트를 만들기 전에 반드시 결정해야함

list04 = [None] * 5 # [None, None, None, None, None]
속성설명
순서 보장요소들이 삽입된 순서대로 저장됨
변경 가능요소 값 수정, 추가, 삭제 가능 (mutable)
중복 허용중복된 값을 가질 수 있음
다양한 자료형숫자, 문자열, 불 등 다양한 자료형 저장 가능

튜플의 기초

  • 튜플은 원소에 순서를 매겨 결함한 것
  • 원소를 변경할 수 없는 이뮤터블(Immutable) 자료형
tuple01 = () 
tuple02 = 1,
tuple03 = (1,)
tuple04 = A', 'B', 'C',

원소가 한개인 경우 원소 뒤 쉼표 필수

tuple01 = 1, 2, 3,
tuple01[0] = 2  # 오류 출력

특징
| 속성 | 설명 |
| ------- | -------------------------- |
| 순서 보장 | 삽입한 순서를 그대로 유지 |
| 변경 불가 | 생성 후 요소 수정, 추가, 삭제 불가 |
| 중복 허용 | 중복된 값을 가질 수 있음 |
| 다양한 자료형 | 숫자, 문자열, 불 등 다양한 자료형 저장 가능 |

리스트와 튜플2

따로 생성한 리스트에서 모든 원소의 값이 같아도 실체는 다름

lst1 = [1,2,3,4,5]
lst2 = [1,2,3,4,5]
lst1 is lst2
False
  • lst1과 lst2의 identity(식별 번호)가 다르기 때문
  • lst1과 lst2는 내용이 같지만
  • 서로 다른 메모리 위치에 저장된 별개의 객체이기 때문에
  • lst1 is lst2는 False를 반환
lst1 = [1,2,3,4,5]
lst2 = lst1  # lst2는 lst1과 같은 메모리 주소를 참조
lst1 is lst2  # True
lst1[2] = 9
lst1 # [1,2,9,4,5]
lst2 # [1,2,9,4,5]
lst1 → [1,2,3,4,5] ← lst2
       (메모리 주소 0x1000)

lst1[2] = 9 실행 후:
lst1 → [1,2,9,4,5] ← lst2
       (메모리 주소 0x1000)

enumerate()

x = ['A','B','C','D']

for i, name in enumerate(x):
    print(i, name)

0 A
1 B
2 C
3 D

for i, name in enumerate(x, 1): # 1부터 카운트
    print(i, name)
1 A
2 B
3 C
4 D

enumerate() 함수는 인덱스와 원소를 짝지어 튜플로 꺼내는 내장 함수

배열 원소를 역순으로 정렬하기

list01 = [1,2,3,4,5,6,7]

for i in range(len(list01)//2):
    list01[i], list01[len(list01)-i-1] = list01[len(list01)-i-1], list01[i]

print(list01)
  • 파이썬의 튜플 언패킹(tuple unpacking) 기능
  • 오른쪽의 list01[len(list01)-i-1], list01[i]는 튜플을 생성하고, 왼쪽의 list01[i], list01[len(list01)-i-1]는 그 튜플의 값을 순서대로 할당
  • 파이썬은 이 작업을 내부적으로 한 번에 처리
  • 즉, 오른쪽의 값을 모두 평가한 후에 왼쪽에 할당하기 때문에, 임시 변수가 없어도 안전하게 값이 교환

기수 변환 함수(진수 변환)

def card_conv(x,r):
    d = ''
    dchar = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'

    while x > 0:
        d += dchar[x % r] # 해당하는 문자를 꺼내 결함
        x //= r

    return d[::-1] # 역순으로 변환

x = int(input())
r = int(input())

print(card_conv(x, r))
  1. dchar = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
  • 0부터 35까지의 숫자를 표현할 수 있는 문자들을 저장
  • 0~9는 그대로 숫자로, 10~35는 A~Z로 표현
  1. while x > 0: 루프에서:
  • x % r: x를 r로 나눈 나머지를 구함
  • dchar[x % r]: 나머지에 해당하는 문자를 dchar에서 찾음
  • d += dchar[x % r]: 찾은 문자를 결과 문자열에 추가
  • x //= r: x를 r로 나눈 몫으로 업데이트
  1. return d[::-1]:
  • 결과 문자열을 뒤집어서 반환
  • 왜냐하면 나머지를 구할 때마다 뒤에서부터 문자를 추가했기 때문

얕은 복사와 깊은 복사

# 얕은 복사 예제
lst1 = [1, [2, 3], 4]
lst2 = lst1.copy()  # 얕은 복사

lst2[1][0] = 5
print(lst1)  # [1, [5, 3], 4] - 내부 리스트가 변경됨
print(lst2)  # [1, [5, 3], 4]

# 깊은 복사 예제
import copy
lst1 = [1, [2, 3], 4]
lst2 = copy.deepcopy(lst1)  # 깊은 복사

lst2[1][0] = 5
print(lst1)  # [1, [2, 3], 4] - 원본 유지
print(lst2)  # [1, [5, 3], 4]

배열의 주요 연산과 복잡도

연산설명시간복잡도
접근인덱스를 통한 직접 접근O(1)
탐색원하는 값 찾기O(n)
삽입중간 삽입 시 요소들 이동 필요O(n)
삭제중간 삭제 시 요소들 이동 필요O(n)

0개의 댓글