[CS-004][기초] 배열·리스트·스택·큐를 순서로 이해하기
페이지 정보

본문
[이번 수업]
여러 값을 다룰 때는 저장하고 꺼낼 순서를 정해야 합니다. 배열·리스트는 번호로 위치를 찾는 모음이고, 스택·큐는 값을 꺼내는 규칙입니다. Python으로 네 개념과 선택 기준을 익힙니다.
[선수지식]
CS-001의 변수·자료형, CS-002의 조건문·반복문, CS-003의 함수와 입출력을 복습하세요. Python 파일을 실행할 수 있으면 됩니다.
[학습목표]
1. 인덱스로 배열과 리스트의 값을 읽고 바꾼다.
2. 스택의 LIFO와 큐의 FIFO를 설명한다.
3. Python list와 deque를 목적에 맞게 선택한다.
4. 비어 있거나 너무 큰 구조를 안전하게 처리한다.
[핵심개념]
배열은 0부터 시작하는 인덱스, 즉 위치 번호로 값을 찾는 구조입니다. 같은 종류의 값을 연속된 칸으로 다루는 경우가 많습니다. Python `array`도 기본값을 타입 코드로 제한해 저장합니다. 크기를 바꿀 수 있어 다른 언어의 고정 길이 배열과 완전히 같지는 않습니다.
리스트는 순서가 있고 크기를 바꿀 수 있는 값의 모음입니다. Python list는 여러 자료형을 담지만 같은 의미의 값을 모으면 읽기 쉽습니다. `items[0]`은 첫 값, `items[-1]`은 마지막 값입니다. `append`는 끝에 추가하고 `pop`은 삭제한 값을 돌려줍니다. 범위 밖 인덱스는 IndexError를 냅니다.
스택은 마지막에 넣은 값이 먼저 나오는 LIFO(Last In, First Out) 규칙입니다. 실행 취소나 괄호 검사처럼 최근 상태를 먼저 처리할 때 알맞습니다. list 끝에서 `append`와 `pop`을 쓰면 스택이 됩니다.
큐는 먼저 넣은 값이 먼저 나오는 FIFO(First In, First Out) 규칙입니다. 접수 순서나 작업 대기열에 어울립니다. list 앞에서 계속 빼면 뒤 원소를 이동해야 하므로 공식 문서는 양쪽 끝 처리에 맞는 `collections.deque`와 `popleft`를 안내합니다. 여러 스레드가 작업을 주고받는다면 동기화된 `queue.Queue`를 검토합니다.
[따라하기]
아래 내용을 structures.py로 저장합니다.
```python
from array import array
from collections import deque
scores = array('i', [10, 20, 30])
scores[1] = 25
tasks = ['로그인', '검색', '저장']
stack = []
stack.append('첫 문서')
stack.append('둘째 문서')
stack_out = stack.pop()
queue = deque()
queue.append('첫 요청')
queue.append('둘째 요청')
queue_out = queue.popleft()
print('배열:', list(scores))
print('리스트 두 번째:', tasks[1])
print('스택에서 나옴:', stack_out)
print('큐에서 나옴:', queue_out)
print('남은 스택:', stack)
print('남은 큐:', list(queue))
assert stack_out == '둘째 문서'
assert queue_out == '첫 요청'
```
Windows PowerShell에서는 `python structures.py`, macOS·Linux에서는 보통 `python3 structures.py`를 실행합니다.
```text
배열: [10, 25, 30]
리스트 두 번째: 검색
스택에서 나옴: 둘째 문서
큐에서 나옴: 첫 요청
남은 스택: ['첫 문서']
남은 큐: ['둘째 요청']
```
스택은 나중에 넣은 문서가, 큐는 먼저 넣은 요청이 먼저 나옵니다. assert가 조용히 끝나면 두 순서 검사도 통과한 것입니다.
[흔한 실수]
- 첫 위치를 1로 생각합니다. Python 인덱스는 0부터 시작합니다.
- `pop()`이 삭제만 한다고 생각합니다. 삭제한 값을 결과로 돌려줍니다.
- 큐를 list의 `pop(0)`으로 오래 운영합니다. 앞쪽 삭제가 반복되면 deque가 적합합니다.
- 이름만 보고 구조를 판단합니다. 실제로 어느 쪽에서 넣고 빼는지 확인하세요.
[보안 주의]
외부 입력으로 구조가 끝없이 커지지 않도록 항목 수와 크기를 제한하세요. 빈 list의 pop이나 빈 deque의 popleft는 IndexError를 내므로 길이를 확인하거나 예외를 처리합니다. 여러 스레드가 같은 대기열을 수정하면 동기화 큐를 사용하세요. 비밀번호·토큰을 작업이나 로그에 남기지 말고 로컬의 가짜 문자열만 사용합니다.
[직접 해볼 과제]
1. 브라우저의 뒤로 가기를 스택으로 표현해 페이지 세 개를 넣고 두 번 꺼내세요.
2. 고객 번호 세 개를 deque에 넣고 접수 순서대로 모두 처리하세요.
3. 빈 구조에서 꺼내기 전에 `if stack:` 또는 `if queue:`로 확인하세요.
[확인문제]
1. 스택의 LIFO와 큐의 FIFO는 각각 어떤 순서인가요?
2. Python list를 큐로 오래 사용할 때 맨 앞 삭제가 불리한 이유는 무엇인가요?
3. 여러 스레드가 작업을 주고받을 때 queue.Queue를 검토하는 이유는 무엇인가요?
[다음 학습]
번호 우선 순환에 따라 다음 글은 TOOL-004 Git 저장소·커밋·변경 이력입니다. CS 다음 수업은 CS-005 해시맵·집합과 빠른 검색입니다.
[공식 참고 자료]
- Python 자료구조 튜토리얼: https://docs.python.org/3/tutorial/datastructures.html
- Python array 문서: https://docs.python.org/3/library/array.html
- Python collections.deque 문서: https://docs.python.org/3/library/collections.html#collections.deque
- Python queue 문서: https://docs.python.org/3/library/queue.html
여러 값을 다룰 때는 저장하고 꺼낼 순서를 정해야 합니다. 배열·리스트는 번호로 위치를 찾는 모음이고, 스택·큐는 값을 꺼내는 규칙입니다. Python으로 네 개념과 선택 기준을 익힙니다.
[선수지식]
CS-001의 변수·자료형, CS-002의 조건문·반복문, CS-003의 함수와 입출력을 복습하세요. Python 파일을 실행할 수 있으면 됩니다.
[학습목표]
1. 인덱스로 배열과 리스트의 값을 읽고 바꾼다.
2. 스택의 LIFO와 큐의 FIFO를 설명한다.
3. Python list와 deque를 목적에 맞게 선택한다.
4. 비어 있거나 너무 큰 구조를 안전하게 처리한다.
[핵심개념]
배열은 0부터 시작하는 인덱스, 즉 위치 번호로 값을 찾는 구조입니다. 같은 종류의 값을 연속된 칸으로 다루는 경우가 많습니다. Python `array`도 기본값을 타입 코드로 제한해 저장합니다. 크기를 바꿀 수 있어 다른 언어의 고정 길이 배열과 완전히 같지는 않습니다.
리스트는 순서가 있고 크기를 바꿀 수 있는 값의 모음입니다. Python list는 여러 자료형을 담지만 같은 의미의 값을 모으면 읽기 쉽습니다. `items[0]`은 첫 값, `items[-1]`은 마지막 값입니다. `append`는 끝에 추가하고 `pop`은 삭제한 값을 돌려줍니다. 범위 밖 인덱스는 IndexError를 냅니다.
스택은 마지막에 넣은 값이 먼저 나오는 LIFO(Last In, First Out) 규칙입니다. 실행 취소나 괄호 검사처럼 최근 상태를 먼저 처리할 때 알맞습니다. list 끝에서 `append`와 `pop`을 쓰면 스택이 됩니다.
큐는 먼저 넣은 값이 먼저 나오는 FIFO(First In, First Out) 규칙입니다. 접수 순서나 작업 대기열에 어울립니다. list 앞에서 계속 빼면 뒤 원소를 이동해야 하므로 공식 문서는 양쪽 끝 처리에 맞는 `collections.deque`와 `popleft`를 안내합니다. 여러 스레드가 작업을 주고받는다면 동기화된 `queue.Queue`를 검토합니다.
[따라하기]
아래 내용을 structures.py로 저장합니다.
```python
from array import array
from collections import deque
scores = array('i', [10, 20, 30])
scores[1] = 25
tasks = ['로그인', '검색', '저장']
stack = []
stack.append('첫 문서')
stack.append('둘째 문서')
stack_out = stack.pop()
queue = deque()
queue.append('첫 요청')
queue.append('둘째 요청')
queue_out = queue.popleft()
print('배열:', list(scores))
print('리스트 두 번째:', tasks[1])
print('스택에서 나옴:', stack_out)
print('큐에서 나옴:', queue_out)
print('남은 스택:', stack)
print('남은 큐:', list(queue))
assert stack_out == '둘째 문서'
assert queue_out == '첫 요청'
```
Windows PowerShell에서는 `python structures.py`, macOS·Linux에서는 보통 `python3 structures.py`를 실행합니다.
```text
배열: [10, 25, 30]
리스트 두 번째: 검색
스택에서 나옴: 둘째 문서
큐에서 나옴: 첫 요청
남은 스택: ['첫 문서']
남은 큐: ['둘째 요청']
```
스택은 나중에 넣은 문서가, 큐는 먼저 넣은 요청이 먼저 나옵니다. assert가 조용히 끝나면 두 순서 검사도 통과한 것입니다.
[흔한 실수]
- 첫 위치를 1로 생각합니다. Python 인덱스는 0부터 시작합니다.
- `pop()`이 삭제만 한다고 생각합니다. 삭제한 값을 결과로 돌려줍니다.
- 큐를 list의 `pop(0)`으로 오래 운영합니다. 앞쪽 삭제가 반복되면 deque가 적합합니다.
- 이름만 보고 구조를 판단합니다. 실제로 어느 쪽에서 넣고 빼는지 확인하세요.
[보안 주의]
외부 입력으로 구조가 끝없이 커지지 않도록 항목 수와 크기를 제한하세요. 빈 list의 pop이나 빈 deque의 popleft는 IndexError를 내므로 길이를 확인하거나 예외를 처리합니다. 여러 스레드가 같은 대기열을 수정하면 동기화 큐를 사용하세요. 비밀번호·토큰을 작업이나 로그에 남기지 말고 로컬의 가짜 문자열만 사용합니다.
[직접 해볼 과제]
1. 브라우저의 뒤로 가기를 스택으로 표현해 페이지 세 개를 넣고 두 번 꺼내세요.
2. 고객 번호 세 개를 deque에 넣고 접수 순서대로 모두 처리하세요.
3. 빈 구조에서 꺼내기 전에 `if stack:` 또는 `if queue:`로 확인하세요.
[확인문제]
1. 스택의 LIFO와 큐의 FIFO는 각각 어떤 순서인가요?
2. Python list를 큐로 오래 사용할 때 맨 앞 삭제가 불리한 이유는 무엇인가요?
3. 여러 스레드가 작업을 주고받을 때 queue.Queue를 검토하는 이유는 무엇인가요?
[다음 학습]
번호 우선 순환에 따라 다음 글은 TOOL-004 Git 저장소·커밋·변경 이력입니다. CS 다음 수업은 CS-005 해시맵·집합과 빠른 검색입니다.
[공식 참고 자료]
- Python 자료구조 튜토리얼: https://docs.python.org/3/tutorial/datastructures.html
- Python array 문서: https://docs.python.org/3/library/array.html
- Python collections.deque 문서: https://docs.python.org/3/library/collections.html#collections.deque
- Python queue 문서: https://docs.python.org/3/library/queue.html
- 이전글[TOOL-004][기초] Git 저장소와 첫 커밋으로 변경 이력 남기기 26.08.31
- 다음글[CORE-004][기초] 문자·이미지·소리를 숫자와 바이트로 보기 26.08.31
댓글목록
등록된 댓글이 없습니다.
