자료구조: 배열, 연결 리스트, 스택, 큐
자료구조는 프로그램이 데이터를 빠르고 쉽게 쓰도록 데이터를 배열해 두는 방법이에요.
- 배열(Array): 크기가 정해져 있고, 항목들이 나란히 놓여요. 인덱스(a[3])로 어느 항목이든 바로 찾아가요. 중간에 끼워 넣기는 느려요.
- 연결 리스트(동적): 각 노드가 값과 다음 노드로 가는 링크를 가져요. 필요에 따라 늘거나 줄지만, 5번째 항목에 가려면 1번부터 4번까지 차례로 지나가야 해요.
- 스택(Stack): 한쪽 끝에서만 넣고(push) 빼요(pop) (LIFO). 되돌리기, 뒤로 가기, 괄호 검사에 써요.
- 큐(Queue): 뒤에서 넣고 앞에서 빼요 (FIFO). 인쇄 작업이나 대기 줄에 써요.
라이브러리에는 이런 도구가 이미 들어 있어요. 파이썬에서는 list가 스택처럼 동작하고(append, pop), collections.deque는 빠른 큐처럼 동작해요. 이미 있으면 새로 만들지 말고 가져다 쓰세요.
stack = []
stack.append(5); stack.append(8)
stack.pop() # gives 8
from collections import deque
q = deque([4, 9]); q.append(2)
q.popleft() # gives 4
IDE 사용하기: 쓰고, 실행하고, 테스트하기
IDE(통합 개발 환경)는 편집기, 실행 버튼, 디버거와 여러 도구를 한곳에 모아 둔 프로그램이에요. 코드에 색을 입히고, 이름을 추천해 주고, 입력하는 동안 오류를 보여 줘요.
- 프로그램을 실행하고 출력을 읽어요.
- 쉬운 값, 보통 값, 까다로운 값(빈 리스트, 0, 아주 큰 수)으로 테스트해요.
- 디버그: 중단점(breakpoint)을 걸고 한 줄씩 실행하며 변수의 값을 지켜봐요.
2D와 3D 시각화 그리고 애니메이션
그림은 규칙을 찾는 데 도움이 돼요. 프로그램은 차트(막대, 선, 산점도), 2D 그림, 3D 장면을 그릴 수 있어요. 애니메이션은 조금씩 바뀐 같은 그림을 계속 다시 그리는 거예요(1초에 약 30~60번). 간단한 방법은 x 같은 변수를 두고, 프레임마다 조금씩 더한 뒤 다시 그리는 것이에요. 이 페이지의 3D도 3D 라이브러리로 같은 방식으로 만들었어요.
고급 스프레드시트 함수
스프레드시트는 함수로 프로그램처럼 일할 수 있어요.
IF(B2>=50,"Pass","Fail")는 두 결과 중 하나를 골라요.SUMIF(B2:B5,">=50")는 조건에 맞는 셀만 더해요.COUNTIF는 그 셀의 개수를 세요.VLOOKUP(2, A2:B5, 2, FALSE)는 첫 번째 열에서 2를 찾아 같은 행의 두 번째 열 값을 돌려줘요.XLOOKUP은 같은 일을 더 쉽게 해요.- 피벗 테이블은 많은 데이터를 그룹별로 합쳐 주고, 차트는 그 결과를 보여 줘요.
관계형 데이터베이스와 SQL
관계형 데이터베이스는 행과 열로 된 테이블에 데이터를 담아요. 각 테이블에는 기본키(primary key)가 있어요. 값이 모두 다른 열이에요(id). 다른 테이블은 그 값을 외래키(foreign key)로 가지고 있어서 서로 이어져요. 좋은 설계는 같은 정보를 한 번만 저장해서 반복되는 데이터가 없게 해요.
SQL은 데이터에 질문하고 데이터를 바꾸는 언어예요.
SELECT name, score FROM students
JOIN marks ON students.id = marks.id
WHERE score >= 50 ORDER BY score DESC;
INSERT INTO marks (id, score) VALUES (5, 67);
UPDATE marks SET score = 55 WHERE id = 2;
DELETE FROM marks WHERE id = 5;무결성(integrity)은 데이터가 늘 올바르게 유지된다는 뜻이에요. 키는 겹치지 않고, 외래키는 실제 있는 행과 맞아야 하고, 값은 알맞은 자료형이어야 해요. 보안은 사용자 비밀번호, 필요한 권한만 주기, 백업이에요. 그리고 사용자가 입력한 글을 SQL 문장에 그대로 붙이지 않고 매개변수(parameter)를 써서 SQL 인젝션을 막아요.
공개 자료에 기여하기
많은 도구와 라이브러리는 오픈 소스예요. 라이선스에 따라 누구나 읽고, 쓰고, 고칠 수 있어요. 버그를 고치거나, 설명서를 다듬거나, 페이지를 번역하거나, 예제를 더해서 도울 수 있어요. 항상 라이선스를 읽고, 출처를 밝히고, 고쳐 달라고 제안할 때는 분명하고 공손하게 써요.
해 보기
3D의 5단계에서 스택에 항목 3개를 넣고(push) 모두 꺼내(pop) 보세요. 나온 순서를 적어요. 큐로도 똑같이 해 보세요. 그다음 먼저 예상하고 나중에 확인해요. 4, 9, 2를 넣고 하나를 뺐을 때, 큐의 맨 앞과 스택의 맨 위에는 어떤 값이 남을까요?
핵심 공식과 정의
- Stack = LIFO (last in, first out): push, pop.
- Queue = FIFO (first in, first out): enqueue, dequeue.
- Array: fixed size, access by index. Linked list: dynamic size, follow links.
- SELECT columns FROM table WHERE condition
- Primary key = unique id. Foreign key = link to another table.
풀이 예제
1. 5, 8, 2를 이 순서로 스택에 넣었어요. 그다음 pop을 두 번 했어요. 지금 맨 위에는 무엇이 있나요?
넣은 뒤의 스택: 5, 8, 2 (2가 맨 위). pop은 먼저 2를, 그다음 8을 꺼내요. 남은 것은 5예요. 맨 위 = 5.
2. 4, 9, 2가 이 순서로 큐에 들어갔어요. dequeue를 한 번 했어요. 지금 맨 앞의 항목은 무엇인가요?
가장 먼저 들어온 것이 나가니까 4가 빠져요. 맨 앞은 9예요.
3. 성적 표: id 1~4의 점수가 72, 45, 88, 51이에요. WHERE score >= 50은 몇 개의 행을 돌려주나요?
72, 88, 51이 50 이상이에요. 그러니까 3개 행이에요.
4. B2:B5 셀에 72, 45, 88, 51이 들어 있어요. =SUMIF(B2:B5,">=50")의 값은 얼마인가요?
72, 88, 51만 더해요. 72 + 88 + 51 = 211.
5. ( [ ] ) 같은 식의 괄호를 검사할 때 왜 스택을 쓸까요?
여는 괄호를 만날 때마다 push해요. 닫는 괄호가 나오면 pop해서 짝이 맞는지 확인해요. 가장 최근에 연 괄호를 가장 먼저 닫아야 하는데(LIFO), 스택이 바로 그렇게 동작해요. 끝났을 때 스택이 비어 있으면 괄호가 모두 맞아요.
자주 하는 실수
- 크기를 미리 알 수 없는데 배열을 쓰는 것. 이럴 때는 리스트나 연결 리스트가 더 좋아요.
- 스택과 큐를 헷갈리는 것. 스택은 가장 새것을, 큐는 가장 오래된 것을 먼저 빼요.
- UPDATE나 DELETE에서 WHERE를 빼먹는 것. 모든 행이 바뀌어 버려요.
- 사용자가 입력한 글을 문자열에 그대로 붙여 SQL을 만드는 것. 대신 매개변수를 쓰세요.