I. 자료와 자료 구조

6. 자료구조·알고리즘, 리스트 · 약 5분

← 전체 목차 이 단원 목차

🎮 이 단원이 게임에서 쓰이는 곳 (언더테일·RPG)

리스트 = 인벤토리(아이템 순서), 대사 한 줄씩 저장, 퀘스트 목록. "몇 번째 칸"으로 바로 접근해서 아이템 정보를 보여줄 때 써요. 배열 vs 연결 리스트는 "인벤에 넣었다 뺐다"가 많으면 연결 리스트가, "n번째 아이템 보기"가 많으면 배열이 유리해요.

언더테일 스타일 인벤토리: 슬롯에 검, 물약, 방패 등 아이템이 들어 있는 모습. 리스트 인덱스 = 슬롯 번호.
언더테일 인벤처럼 슬롯 번호가 인덱스. append로 획득·pop(인덱스)로 사용.

자료구조와 알고리즘

자료구조는 자료를 어떤 순서·형태로 담아 둘지 정한 구조예요. 게임에서 대사 목록(리스트), 메뉴 뒤로가기(스택), 이벤트 순서(큐)처럼요.

알고리즘은 문제를 풀기 위한 단계별 방법이에요. 좋은 자료구조를 고르면 알고리즘이 더 빨라져요. 프로그래밍기능사 실기에서 자료구조를 이용한 코딩이 나올 수 있어요.

😄 조크 세상에는 10가지 종류의 사람이 있어요 — 2진수를 아는 사람이랑 모르는 사람. (10을 2진수로 쓰면 2예요.) 더 보기 →

리스트(List, 리스트)

순서가 있는 자료의 나열이에요. 같은 종류의 값들이 한 줄로 배치됩니다.

📌 이론(자료구조 연산) ↔ 파이썬 함수(메서드)

리스트 연산 맨 뒤에 넣기 → list.append(값)  |  i번째 칸 제거·반환 → list.pop(인덱스)

대응 파이썬 list는 순서 있는 배열처럼 씁니다. 리스트의 "맨 뒤에 넣기"·"몇 번째 칸 지우기"에 아래 메서드를 써요.

리스트.append(값)
맨 뒤에 한 칸 추가. 배열에서 "끝에 삽입"에 해당해요. 리스트 길이가 n이면 새 값은 인덱스 n에 들어갑니다. : arr = [10, 20]; arr.append(30) → arr은 [10, 20, 30]. 괄호 안에 넣을 값 하나를 쓰는 게 인자(argument)예요.
리스트.pop(인덱스)
지정한 인덱스의 값을 제거하고 그 값을 반환해요. 예: pop(1)이면 1번 칸(두 번째 값)이 사라집니다. 뒤쪽 칸들이 한 칸씩 당겨져서 채워져요. : arr = [10, 20, 30]; x = arr.pop(1) → arr은 [10, 30], x는 20. 인덱스는 0부터 세요(0=첫 번째, 1=두 번째).

함수(메서드) 호출이란? 객체.이름(인자) 형태로 "이름에 해당하는 일을 인자에 대해 실행해라"라고 쓰는 거예요. arr.append(40)은 "arr 리스트에 append를 실행하고, 인자 40을 넘긴다" → 맨 뒤에 40이 추가돼요.

왜 이렇게 쓰나요? 파이썬 list는 "동적 배열"이라 맨 뒤 추가는 빠르고, 인덱스로 접근·삭제가 직관적이에요. 실습에서는 "append로 넣고, pop(인덱스)로 특정 위치 제거"를 익히면 됩니다.

📌 리스트·배열 개념 — Python / C# / C++ 비교

같은 "순서 있는 칸"을 Python은 list, C#은 List<T>·배열, C++은 vector로 씁니다. 용어와 문법만 맞추면 개념은 같아요.

연산 Python (list) C# C++
만들기 arr = [10, 20, 30] var list = new List<int>() { 10, 20, 30 }; vector<int> v = {10, 20, 30};
맨 뒤에 추가 arr.append(40) list.Add(40); v.push_back(40);
i번째 값 보기 arr[i] list[i] v[i]
i번째 제거 arr.pop(1) list.RemoveAt(1); v.erase(v.begin()+i);
길이(개수) len(arr) list.Count v.size()

정리 Python list ↔ C# List<T> ↔ C++ vector (동적 배열). append↔Add↔push_back, 인덱스 접근은 세 언어 모두 [i].

🎮 응용 게임에서는 인벤 슬롯 번호 = 인덱스로 아이템 보기, 정렬(IV단원)로 이름순·가격순 정렬, 이진 탐색(V단원)으로 ID로 빠르게 찾기 등 리스트를 기반으로 확장해요.

맨 뒤에 추가하는 메서드, 1번 인덱스 제거할 때 pop(?)

arr._____(40)   →   arr.pop(_____)

첫 빈칸: 두 번째:

🐍 파이썬 (바로 실행)
🟨 자바스크립트로 확인

문제 및 해설

연결 리스트에서 "맨 앞 노드"를 뭘이라고 부르나요? 삽입·삭제가 배열보다 유리한 이유는?

① 맨 앞 노드: head(헤드)

시험에 자주 나오는 용어예요. 맨 뒤 노드는 tail(테일)이라고 부릅니다.

② 삽입·삭제가 배열보다 유리한 이유

  • 배열: 칸이 연달아 있어서, 가운데에 하나 넣거나 빼려면 그 뒤의 값들을 전부 한 칸씩 밀거나 당겨야 합니다.
  • 연결 리스트: 각 노드가 "다음 노드 주소"만 갖고 있어서, 가운데에 넣거나 뺄 때는 연결만 바꿔 주면 됩니다. 옆 칸을 전부 옮길 필요가 없어요.

한 줄 요약 head = 맨 앞 노드. 연결 리스트는 "연결만 바꾸면" 되니까 가운데 삽입·삭제가 배열보다 유리합니다. 더 많은 예제 →

문제 및 답 확인

배열과 연결 리스트 중 "몇 번째 칸에 바로 접근"하기 좋은 건?
답 보기

정답: 배열

배열은 칸이 연달아 있으므로 "몇 번째"만 알면 그 위치로 곧바로 갈 수 있어요(인덱스로 바로 접근). 연결 리스트는 맨 앞(head)부터 "다음, 다음"을 따라가야 하므로, N번째를 보려면 N번 걸어가야 합니다.

한 줄 요약 바로 접근은 배열, 가운데 삽입·삭제는 연결 리스트가 유리해요.

도전과제

풀어 본 뒤 정답을 펼쳐 확인하세요.

도전 1. 인벤토리 리스트가 ["검", "물약", "방패"]일 때, 1번 슬롯(물약)을 사용해서 제거한 뒤 맨 뒤에 "열쇠"를 추가하면 최종 리스트는?
정답 보기

정답: ["검", "방패", "열쇠"]

pop(1) → "물약" 제거, 리스트는 ["검", "방패"]. append("열쇠") → ["검", "방패", "열쇠"]. 게임에서 "아이템 사용 후 새 아이템 획득" 순서를 그대로 코드로 옮긴 거예요.

도전 2. "가운데 삽입·삭제가 많을 때" 배열과 연결 리스트 중 어떤 쪽이 유리한가요? 그 이유를 한 줄로 쓰면?
정답 보기

정답: 연결 리스트가 유리하다.

이유: 연결 리스트는 "다음 노드 주소"만 바꿔 주면 되지만, 배열은 가운데에 넣거나 빼면 그 뒤의 원소들을 한 칸씩 밀거나 당겨야 해서 비용이 커요.

위 실습은 이 강의(리스트)에서 배운 append·pop(인덱스)을 쓰는 예제입니다. 손으로 해보려면 실습: 리스트 (손으로 하기).

I단원 심화 실습 (3단계) — 이 페이지 안에서

아래는 이 단원(자료·진법·리스트)을 파이썬으로 한 단계씩 확장하는 실습이에요. 페이지 이동 없이 스크롤해서 진행하면 됩니다.

  1. 1단계 진법: 게임의 HP·골드 같은 숫자를 bin(), hex()로 2진수·16진수 확인.
  2. 2단계 리스트: 인벤토리처럼 append로 넣고, pop(인덱스)로 빼 보기 (위 실습과 동일한 API).
  3. 3단계 세이브 흉내: {"hp": 25, "gold": 100, "inv": ["검", "물약"]}처럼 묶어서 출력해 보기.
🐍 심화 1단계: 진법 확인
🐍 심화 2단계: 리스트 인벤 (이 강의 append·pop)
🐍 심화 3단계: 세이브 데이터 흉내

아래 코드창에 save = {"hp": 25, "gold": 100, "inv": ["검", "물약"]}; print(save) 입력 후 실행해 보세요.

기출 유형