풀스택 백엔드 2026.07.13

syyu21b·2026년 7월 13일

풀스택 - 백엔드

목록 보기
42/49
post-thumbnail

[SECTION 04. 파이썬 기초 문법 - 리스트]

1. 리스트

  • 리스트(List)는 여러 개의 값을 순서대로 저장할 수 있는 자료형입니다.
  • 대괄호 [] 안에 값을 넣어 만듭니다.
  • 리스트는 순서(인덱스)를 가지고, 변경 가능(mutable) 합니다.

예제 1: 리스트 생성과 인덱싱

fruits = ["사과", "배", "포도", "귤"]

print("첫 번째 과일:", fruits[0])   # 인덱스 0
print("마지막 과일:", fruits[-1])  # 음수 인덱스
print("리스트 길이:", len(fruits))

# 리스트 요소 변경
fruits[1] = "바나나"
print("변경 후:", fruits)

예제 2: 리스트 안의 다양한 자료형

data = [10, 3.14, "Python", True, [1, 2, 3]]

print("정수:", data[0])
print("실수:", data[1])
print("문자열:", data[2])
print("불:", data[3])
print("리스트 안의 리스트:", data[4][1])
data = [10, 3.14, "Python", True, [1, 2, 3]]

for i in range(0, len(data)):
    print(f"{i}번째 인덱스의 값: {data[i]} / 타입: {type(data[i])}")
    
for item in data:
    print(item, type(item))

2. 리스트의 연산

  • 리스트는 덧셈(+), 곱셈(*) 연산을 지원합니다.
  • 슬라이싱으로 부분 리스트를 추출할 수 있습니다.

예제 1: 덧셈과 곱셈

a = [1, 2, 3]
b = [4, 5]

print("리스트 덧셈:", a + b)    # [1,2,3,4,5]
print("리스트 곱셈:", b * 3)   # [4,5,4,5,4,5]
print("길이:", len(a + b * 2))

예제 2: 슬라이싱

nums = [10, 20, 30, 40, 50, 60]

print("앞 3개:", nums[:3])   # [10,20,30]
print("뒤 3개:", nums[-3:])  # [40,50,60]
print("인덱스가 짝수 번째:", nums[::2])  # [10,30,50]
print("역순:", nums[::-1])   # [60,50,40,30,20,10]

파이썬 슬라이싱(slicing) 문법 정리

기본 문법

리스트[시작::간격]
  • 시작 : 어디서부터 시작할지 (기본값 = 0)
  • : 어디까지 가져올지 (끝 인덱스는 포함하지 않음, 기본값 = 끝까지)
  • 간격(step) : 몇 칸씩 건너뛸지 (기본값 = 1)

예시 코드

nums = [10, 20, 30, 40, 50, 60]
  1. 앞 3개 가져오기
print(nums[:3])   # [10, 20, 30]
  1. 인덱스 2부터 4까지
print(nums[2:5])  # [30, 40, 50]
  1. 처음부터 끝까지, 2칸씩 건너뛰며
print(nums[::2])  # [10, 30, 50]
  1. 역순으로 뒤집기
print(nums[::-1]) # [60, 50, 40, 30, 20, 10]

핵심 정리

  • [:] → 리스트 전체 복사
  • [::2] → 2칸씩 건너뛰며 가져오기
  • [::-1] → 리스트를 역순으로 뒤집기

👉 즉, nums[::2]짝수 번째 인덱스(0,2,4,...) 값들만 가져오는 표현이다.

#       0   1   2   3   4   5   6
nums = [10, 20, 30, 40, 50, 60]

# 끝까지 출력하는 방법
print(nums)
print(nums[:])
print(nums[0:len(nums)])

# 건너 뛰면서 가져오기
print(nums[::2])

# 역순으로 출력하기
print(nums[::-1])

3. 리스트의 메소드

  • append(x): 맨 뒤에 요소 추가
  • insert(i, x): 원하는 위치에 요소 추가
  • remove(x): 값 제거
  • pop(): 마지막 요소 꺼내기
  • sort(): 정렬
  • reverse(): 역순

예제 1: 추가와 삭제

nums = [3, 1, 4]

nums.append(5)
print("append:", nums)

nums.insert(1, 2)
print("insert:", nums)

nums.remove(4)
print("remove:", nums)

last = nums.pop()
print("pop:", last, nums)
nums = [3, 1, 3, 4]

# 추가 (마지막에 추가)
nums.append(5)
print("추가 후:", nums)

# 추가 (특정 위치에 추가)
nums.insert(0, 100)
print("특정 위치 추가 후:", nums)

# 제거 -> 매개변수로 들어가는 건 제거할 인덱스가 아니라 제거할 값
# 이 메소드는 인덱스 0에 가장 가까운 값 하나만 제거해 준다
nums.remove(3)
print("3 제거 후:", nums)

# 제일 마지막 요소 꺼내오기
last = nums.pop()
print("마지막 요소:", last)

예제 2: 정렬과 뒤집기

scores = [88, 95, 70, 100, 99]

# 정렬 (오름차순)
scores.sort(reverse=False)
print("오름차순:", scores)

# 정렬 (내림차순)
scores.sort(reverse=True)
print("내림차순:", scores)

# 역순
scores.reverse()
print("역순으로 변환:", scores)

4. 연습문제

  1. 리스트 nums = [1, 2, 3, 4, 5]에서

    • append로 6을 추가하고
    • remove로 3을 제거한 뒤
    • 최종 리스트를 출력하세요.

    준비 코드

    nums = [1, 2, 3, 4, 5]
    
    # 아래에 코드 작성
    • 정답
      nums = [1, 2, 3, 4, 5]
      
      nums.append(6)
      nums.remove(3)
      
      print("리스트:", nums)
  2. 사용자에게 정수 5개를 입력 받아 리스트에 저장하고, 최댓값과 최솟값을 출력하세요. * max(), min() 함수를 이용할 것

    • 정답
nums = []

# 다섯 번 반복할 for문
for i in range(5):
    num = int(input(f"{i + 1}번째 정수 입력:"))
    nums.append(num)

print("입력받은 숫자:", nums)
print("최댓값:", max(nums))
print("최솟값:", min(nums))

nums = []

count = 0

# while문으로 다섯 번 반복
while count < 5:
    num = int(input(f"{count + 1}번째 정수 입력:"))
    nums.append(num)
    count += 1

print("입력받은 숫자:", nums)
print("최댓값:", max(nums))
print("최솟값:", min(nums))

[SECTION 05. 파이썬 기초 문법 - 딕셔너리]

1. 딕셔너리

  • 딕셔너리(Dictionary)는 키(key)와 값(value)의 쌍으로 데이터를 저장하는 자료형입니다.
  • 중괄호 {} 안에 "키:값" 형태로 정의합니다.
  • 키는 중복될 수 없으며, 값은 얼마든지 중복 가능합니다.
  • 키로 값을 빠르게 찾을 수 있어 검색에 유용합니다.

예제 1: 딕셔너리 생성과 접근

student = {
    "name": "Alice",
    "age": 21,
    "major": "Computer Science"
}

print("이름:", student["name"])
print("나이:", student["age"])
print("전공:", student["major"])

# 새로운 키-값 추가
student["grade"] = "A"
print("추가 후:", student)
student = {
    "name": "Alice",
    "age": 21,
    "major": "Computer Science"
}

print("변경 전 이름:", student["name"])
print("나이:", student["age"])
print("전공:", student["major"])

student["name"] = "ROONEY"

print("변경 후 이름:", student["name"])
print(student)

print("=== 키 추가 ===")
student["height"] = 177.7

print(student)

예제 2: 다양한 타입의 값

info = {
    "id": 1001,
    "name": "Kim",
    "scores": [90, 85, 92],
    "is_active": True
}

print("학생 ID:", info["id"])
print("학생 이름:", info["name"])
print("점수 목록:", info["scores"])
print("평균 점수:", sum(info["scores"]) / len(info["scores"]))
print("활성 상태:", info["is_active"])

print("정수:", type(info["id"]))
print("문자열:", type(info["name"]))
print("리스트:", type(info["scores"]))
print("불린:", type(info["is_active"]))

2. 딕셔너리 연산

  • in : 키 존재 여부 확인
  • del dict[key] : 항목 삭제
  • len(dict) : 항목 개수 확인

예제 1: 키 검사와 삭제

person = {"name": "Lee", "age": 30, "city": "Seoul"}

print("name 키 있나요?", "name" in person)
print("gender 키 있나요?", "gender" in person)

del person["city"]
print("삭제 후:", person)
print("길이:", len(person))

예제 2: 딕셔너리 순회

scores = {"Kim": 90, "Lee": 85, "Park": 92}

for key in scores:
    print("이름:", key, "점수:", scores[key])

print("키 목록:", list(scores.keys()))
print("값 목록:", list(scores.values()))
print("키-값 쌍:", list(scores.items()))

3. 딕셔너리의 메서드

  • get(key, default) : 키가 없으면 기본값 반환
  • keys() : 모든 키 반환
  • values() : 모든 값 반환
  • items() : 모든 키-값 쌍 반환 (튜플 형태로 반환)
  • update() : 다른 딕셔너리 병합

예제 1: get()과 update()

user = {"id": "admin", "pw": "1234"}

print("아이디:", user.get("id"))
print("이메일:", user.get("email", "없음"))

user.update({"email": "admin@example.com", "pw": "0000"})
print("업데이트 후:", user)

예제 2: keys(), values(), items() 활용

product = {"name": "노트북", "price": 1200000, "brand": "Samsung"}

print("모든 키:", product.keys())
print("모든 값:", product.values())
print("키-값 쌍:", product.items())

for k, v in product.items():
    print(f"{k}{v}")

4. 딕셔너리를 리스트로 변환

  1. 딕셔너리를 리스트로 변환하는 경우
    • 딕셔너리는 **검색과 매핑(mapping)**에 강하지만, 실제 업무에서는 정렬·필터링·시각화·데이터 전송(JSON 등) 과정이 필요할 때가 많습니다.
    • 이때 리스트는 순서가 있는 자료 구조라서, 정렬이나 반복 처리, 조건 필터링에 유리합니다. 따라서 실무에서는 딕셔너리를 리스트로 변환해 다음과 같은 작업을 자주 합니다.
      • 통계/분석 결과 정렬 → 판매량, 점수, 빈도수 순위 매기기
      • 데이터 전송/저장 → API 응답(JSON)이나 DB insert를 위해 리스트 구조로 변경
      • 조건부 추출 → 특정 기준에 맞는 데이터만 필터링

예제 1: 매출 데이터 분석

# 상품별 판매량 (딕셔너리)
sales = {"노트북": 120, "마우스": 55, "키보드": 78, "모니터": 33}

# (키, 값) 쌍을 리스트로 변환
sales_list = list(sales.items()) # 튜플로 변환됨
print(sales_list)
# [('노트북', 120), ('마우스', 55), ('키보드', 78), ('모니터', 33)]

# 판매량 기준 내림차순 정렬
top_sales = sorted(sales_list, key=lambda x: x[1], reverse=True)
print("판매량 순위:", top_sales)
# [('노트북', 120), ('키보드', 78), ('마우스', 55), ('모니터', 33)]

sorted() 함수 정리

  • sorted()는 파이썬에서 리스트, 딕셔너리, 튜플 등 반복 가능한(iterable) 자료형을 정렬할 때 사용하는 함수입니다.
  • 정렬된 새로운 리스트를 반환하며, 원본 데이터는 바뀌지 않습니다.
  • ✅ 기본 문법
    sorted(iterable, key=None, reverse=False) # 정렬할 객체, 기준 키, 역순 여부
  • ✅ 예제
    numbers = [3, 1, 4, 2]
    print(sorted(numbers))  
    # [1, 2, 3, 4]  (오름차순)
    
    print(sorted(numbers, reverse=True))  
    # [4, 3, 2, 1]  (내림차순)
  • ✅ key를 활용한 정렬
    sales_list = [("노트북", 120), ("마우스", 55), ("키보드", 78)]
    
    # 제품명(x[0]) 기준 정렬
    print(sorted(sales_list, key=lambda x: x[0]))
    # [('노트북', 120), ('마우스', 55), ('키보드', 78)]
    
    # 판매량(x[1]) 기준 정렬 (내림차순)
    print(sorted(sales_list, key=lambda x: x[1], reverse=True))
    # [('노트북', 120), ('키보드', 78), ('마우스', 55)]

예제 2: 합격자 명단 추출

# 학생 점수 데이터 (딕셔너리)
scores = {"kim": 85, "lee": 90, "park": 78, "choi": 95}

# (이름, 점수) 리스트로 변환
scores_list = list(scores.items())

# 90점 이상 학생만 필터링
passed = []
for name, score in scores_list:
    if score >= 90:
        passed.append((name, score))

print("합격자 명단:", passed)
# [('lee', 90), ('choi', 95)]

5. 연습문제

  1. 딕셔너리 student = {"name":"홍길동","age":20,"major":"CS"}에서

    • "age" 값을 1 증가시키고,
    • "grade":"A" 키-값을 추가한 뒤,
    • 최종 딕셔너리를 출력하세요.

    준비 코드

    student = {"name": "홍길동", "age": 20, "major": "CS"}
    
    # 아래에 코드 작성

    : 정답

    student = {"name":"홍길동","age":20,"major":"CS"}
    
    if "age" in student:
        student["age"] = student["age"] + 1
    
    student["grade"] = "A"
    
    print("최종 딕셔너리:", student)
  2. 사용자에게 학생 이름과 점수를 3명 입력받아 딕셔너리에 저장하고,

    모든 학생의 평균 점수를 출력하세요.

    준비 코드 및 출력 예시

    scores = {}
    
    # 아래에 코드 작성
    
    # 입력 예시
    
    학생 이름: 김수한
    점수: 90
    학생 이름: 한코딩
    점수: 100
    학생 이름: 루니
    점수: 80
    
    # 출력 예시
    
    학생 점수: {'김수한': 90, '한코딩': 100, '루니': 80}
    평균 점수: 90.0
    
    #참고 예제
    scores = {}
    
    name1 = input("학생의 이름: ")
    score1 = int(input("학생의 점수: "))
    scores[name1] = score1
    
    print(scores)
    scores = {}
    
    # 아래에 코드 작성
    for i in range(3):
        name = input(f"{i + 1}번째 학생 이름:")
        score = int(input(f"{i + 1}번째 학생 점수:"))
        scores[name] = score
    
    print("학생 점수:", scores)
    
    total = 0
    for score in scores.values():
        total += score
    
    print("평균 점수:", total / 3.0)
    
    print("=== 등록된 학생 명단 ===")
    for name in scores.keys():
        print(f"이름: {name}")
    
    while True:
        search_name = input("학생 이름 입력:")
    
        if search_name in scores:
            print(f"{search_name} 학생의 점수는 {scores[search_name]}점입니다.")
        else:
            print("해당 학생은 존재하지 않습니다.")
    

[SECTION 06. 파이썬 기초 문법 - 튜플과 세트]

1. 튜플

  • 튜플(Tuple)은 변경 불가능(immutable) 한 자료형입니다.
  • 소괄호 () 안에 값을 넣어 정의합니다.
  • 읽기 전용 데이터, 여러 값을 한꺼번에 반환할 때 자주 사용됩니다.

예제 1: 튜플 생성과 인덱싱

fruits = ("사과", "배", "포도", "귤")

print("첫 번째 과일:", fruits[0])
print("마지막 과일:", fruits[-1])
print("길이:", len(fruits))

# 튜플은 변경 불가 → 아래 코드는 오류 발생
# fruits[1] = "바나나"
fruits = ("사과", "배", "포도", "귤")

# for문을 이용하여 출력
print("=== for문 ===")
for fruit in fruits:
    print(fruit)

# 인덱싱 출력
print("=== 인덱싱 출력 ===")
print(fruits[0])

# 슬라이싱 출력
print("=== 슬라이싱 출력 ===")
print(fruits[0:2])

# 길이 출력
print("=== 길이 ===")
print("길이:", len(fruits))

예제 2: 다중 대입(언패킹)

person = ("Alice", 25, "Seoul")

name, age, city = person
print("이름:", name)
print("나이:", age)
print("사는 곳:", city)

# 값을 교환할 때도 활용
a, b = 10, 20
a, b = b, a
print("a:", a, "b:", b)

# 중간 변수를 사용할 경우

a = 10
b = 20

temp = a # a의 값은 b로 인해 대체되기 때문에 중간 변수에 보관해줘야 한다

a = b
b = temp

# a와 b의 값을 교환하는 코드 작성

print("a =", a)
print("b =", b)

2. 튜플의 메서드

  • count(x): 해당 값의 개수 반환
  • index(x): 해당 값의 인덱스 반환

예제 1: count와 index

nums = (1, 2, 3, 2, 4, 2)

print("2의 개수:", nums.count(2))
print("3의 위치:", nums.index(3))

예제 2: 여러 자료형 포함

data = (1, "Python", 3.14, True)

for item in data:
    print("요소:", item, "→ 타입:", type(item))

print("총 개수:", len(data))

3. 튜플의 활용

  • 함수에서 여러 개 값을 반환할 때 자주 사용됩니다.
  • 좌표나 고정된 데이터를 표현할 때도 유용합니다.

예제 1: 함수 반환값

def min_max(numbers):
    return min(numbers), max(numbers)

result = min_max([10, 3, 7, 5, 2])
print("최솟값:", result[0])
print("최댓값:", result[1])

low, high = min_max([4, 8, 1, 9])
print("low:", low, "high:", high)

예제 2: 좌표 표현

point = (3, 5)

print("x 좌표:", point[0])
print("y 좌표:", point[1])

# 언패킹
x, y = point
print(f"좌표는 ({x}, {y}) 입니다.")

4. 세트

  • 세트(Set)는 중복을 허용하지 않고, 순서가 없는 집합 자료형입니다.
  • 중괄호 {} 또는 set()을 이용해 생성합니다.
  • 수학의 집합 개념과 비슷하게 합집합, 교집합, 차집합 연산을 지원합니다.

예제 1: 세트 기본

s = {1, 2, 3, 3, 4, 4, 5}
print("세트:", s)  # 중복 제거됨

s.add(6)
print("추가 후:", s)

# 해당 인덱스를 추가하는 게 아니라 해당 값을 찾아가서 지운다.
s.remove(3)
print("삭제 후:", s)

예제 2: set() 활용

text = "hello"
letters = set(text)

print("문자 집합:", letters)
print("길이:", len(letters))

letters.add("z")
print("추가 후:", letters)

5. 세트의 연산

  • 합집합: | 또는 union()
  • 교집합: & 또는 intersection()
  • 차집합: - 또는 difference()

예제 1: 집합 연산자

a = {1, 2, 3, 4}
b = {3, 4, 5, 6}

# 합집합
print("=== 합집합 ===")
print(a | b)
print(a.union(b))

# 교집합
print("=== 교집합 ===")
print(a & b)
print(a.intersection(b))

# 차집합
print("=== 차집합 ===")
print(a - b)
print(a.difference(b))

예제 2: 메서드 활용

x = {10, 20, 30}
y = {30, 40, 50}

print("합집합:", x.union(y))
print("교집합:", x.intersection(y))
print("차집합:", x.difference(y))

6. 세트의 메서드

  • add(x): 원소 추가
  • remove(x): 원소 제거 (없으면 오류)
  • discard(x): 원소 제거 (없어도 오류 없음)
  • clear(): 비우기

예제 1: add/remove/discard

s = {1, 2, 3}

s.add(4)
print("add:", s)

s.remove(2)
print("remove:", s)

s.discard(10)  # 오류 발생하지 않음
print("discard 후:", s)

예제 2: clear

numbers = {100, 200, 300}
print("초기 세트:", numbers)

numbers.clear()
print("clear 후:", numbers)

7. 연습문제

  1. 튜플 (10, 20, 30, 40, 50)에서

    • 3번째 요소를 출력하고,
    • countindex 메서드를 각각 사용해 보세요.

    준비 코드

    t = (10, 20, 30, 40, 50)
    
    # 아래에 코드 작성

    : 정답

    t = (10, 20, 30, 40, 50)
    
    print("세 번째 요소:", t[2])
    
    print("30의 갯수:", t.count(30))
    print("40의 위치:", t.index(40))
  2. 반 A와 반 B의 학생들이 수강하는 과목을 각각 입력받아 세트로 저장한 뒤, 두 반 모두 수강하는 공통 과목(교집합)을 출력하시오

    준비 코드

    a_subjects = set()
    b_subjects = set()
    
    print("반 A 과목 3개 입력:")
    # 아래에 코드 작성

    : 정답

    a_subjects = set()
    b_subjects = set()
    
    print("A반 수강 과목")
    for i in range(3):
        subject = input("수강 과목: ")
        a_subjects.add(subject)
    
    print("B반 수강 과목")
    for i in range(3):
        subject = input("수강 과목: ")
        b_subjects.add(subject)
    
    print("두 학급의 공통 수강 과목:", a_subjects.intersection(b_subjects))

0개의 댓글