🔎 전북과학고 정보수업 정렬과 탐색 OOP코드 수행평가

2026학년도 1학기 정보 알고리즘과 프로그래밍 영역

🌈 학습 목표

정렬과 탐색은 데이터를 효율적으로 다루기 위한 핵심 알고리즘입니다. 이 자료는 기초 개념 5개, 개념 응용 5개, 실생활 심화 활용 5개로 나누어 객체지향 프로그래밍 방식으로 정리했습니다.

기초 개념 5개
숫자 정렬, 문자열 정렬, 순차 탐색, 최댓값·최솟값, 길이 기준 정렬
개념 응용 5개
학생 순위, 이진 탐색, 상품 가격, 도서 검색, 중복 제거 정렬
실생활 심화 5개
배송 우선순위, 병원 대기열, 검색 엔진, 성적 관리, 로그 분석
기초 개념 1OOP 코드정렬과 탐색

1. 숫자 리스트 오름차순·내림차순 정렬

개념 상세 설명

정렬은 데이터를 특정 기준에 따라 순서대로 나열하는 알고리즘입니다. 오름차순은 작은 값에서 큰 값으로, 내림차순은 큰 값에서 작은 값으로 배치합니다.
class NumberSorter:
    def __init__(self, numbers):
        self.numbers = numbers

    def ascending(self):
        return sorted(self.numbers)

    def descending(self):
        return sorted(self.numbers, reverse=True)

sorter = NumberSorter([8, 3, 1, 9, 5])

print("오름차순:", sorter.ascending())
print("내림차순:", sorter.descending())

코드 상세 설명

  • NumberSorter 클래스는 숫자 리스트를 속성으로 저장합니다.
  • ascending()은 sorted()를 사용하여 오름차순 정렬 결과를 반환합니다.
  • descending()은 reverse=True 옵션으로 내림차순 정렬 결과를 반환합니다.
  • sorted()는 원본 리스트를 직접 바꾸지 않고 새로운 리스트를 만듭니다.
기초 개념 2OOP 코드정렬과 탐색

2. 문자열 알파벳순 정렬

개념 상세 설명

문자열도 정렬할 수 있습니다. 기본 정렬은 사전식 순서, 즉 알파벳 순서로 이루어집니다.
class WordAlphabetSorter:
    def __init__(self, words):
        self.words = words

    def sort_words(self):
        return sorted(self.words)

    def reverse_words(self):
        return sorted(self.words, reverse=True)

words = WordAlphabetSorter(["banana", "apple", "cherry", "date"])

print(words.sort_words())
print(words.reverse_words())

코드 상세 설명

  • words는 문자열 리스트입니다.
  • sort_words()는 알파벳 순서로 단어를 정렬합니다.
  • reverse_words()는 알파벳 역순으로 단어를 정렬합니다.
  • 문자열 정렬은 단어 목록, 이름 목록, 사전 만들기 등에 활용됩니다.
기초 개념 3OOP 코드정렬과 탐색

3. 순차 탐색으로 값 찾기

개념 상세 설명

순차 탐색은 데이터를 앞에서부터 하나씩 확인하면서 목표값을 찾는 가장 기본적인 탐색 방법입니다.
class LinearSearch:
    def __init__(self, data):
        self.data = data

    def find(self, target):
        for index, value in enumerate(self.data):
            if value == target:
                return index
        return -1

searcher = LinearSearch([10, 20, 30, 40, 50])

print(searcher.find(30))
print(searcher.find(99))

코드 상세 설명

  • LinearSearch 클래스는 탐색할 데이터를 저장합니다.
  • enumerate()는 인덱스와 값을 함께 꺼냅니다.
  • 목표값을 찾으면 해당 인덱스를 반환합니다.
  • 끝까지 찾지 못하면 -1을 반환합니다.
기초 개념 4OOP 코드정렬과 탐색

4. 최댓값과 최솟값 찾기

개념 상세 설명

탐색은 특정 값만 찾는 것이 아니라, 데이터 안에서 최댓값이나 최솟값을 찾는 과정도 포함합니다.
class MinMaxFinder:
    def __init__(self, numbers):
        self.numbers = numbers

    def minimum(self):
        return min(self.numbers)

    def maximum(self):
        return max(self.numbers)

finder = MinMaxFinder([42, 17, 88, 23, 65])

print("최솟값:", finder.minimum())
print("최댓값:", finder.maximum())

코드 상세 설명

  • min()은 리스트에서 가장 작은 값을 찾습니다.
  • max()는 리스트에서 가장 큰 값을 찾습니다.
  • minimum()과 maximum()은 각각 최솟값과 최댓값을 반환합니다.
  • 성적, 온도, 매출 데이터 분석에서 기본적으로 사용됩니다.
기초 개념 5OOP 코드정렬과 탐색

5. 문자열 길이 기준 정렬

개념 상세 설명

정렬 기준은 값 자체가 아니라 길이, 점수, 날짜처럼 원하는 기준으로 바꿀 수 있습니다.
class WordLengthSorter:
    def __init__(self, words):
        self.words = words

    def sort_by_length(self):
        return sorted(self.words, key=len)

    def longest(self):
        return max(self.words, key=len)

words = WordLengthSorter(["AI", "Python", "Data", "Algorithm"])

print(words.sort_by_length())
print("가장 긴 단어:", words.longest())

코드 상세 설명

  • key=len은 문자열의 길이를 정렬 기준으로 사용합니다.
  • sort_by_length()는 짧은 단어부터 긴 단어 순서로 정렬합니다.
  • longest()는 길이가 가장 긴 단어를 찾습니다.
  • key 옵션은 응용 정렬의 핵심입니다.
개념 응용 1OOP 코드정렬과 탐색

6. 학생 점수 기준 순위 정렬

개념 상세 설명

딕셔너리 리스트에서는 특정 key 값을 기준으로 정렬할 수 있습니다. 학생 데이터를 점수 기준으로 정렬하면 순위를 만들 수 있습니다.
class StudentRanker:
    def __init__(self, students):
        self.students = students

    def rank(self):
        return sorted(self.students, key=lambda x: x["점수"], reverse=True)

    def top_student(self):
        return self.rank()[0]

students = [
    {"이름": "김민수", "점수": 88},
    {"이름": "이지은", "점수": 95},
    {"이름": "박서준", "점수": 76}
]

ranker = StudentRanker(students)

print(ranker.rank())
print("1등:", ranker.top_student())

코드 상세 설명

  • students는 학생 이름과 점수를 가진 딕셔너리 리스트입니다.
  • lambda x: x['점수']는 각 학생의 점수 값을 정렬 기준으로 꺼냅니다.
  • reverse=True는 높은 점수부터 정렬하라는 뜻입니다.
  • top_student()는 정렬 결과의 첫 번째 학생을 반환합니다.
개념 응용 2OOP 코드정렬과 탐색

7. 이진 탐색으로 빠르게 찾기

개념 상세 설명

이진 탐색은 정렬된 데이터에서 중간값을 기준으로 탐색 범위를 절반씩 줄이는 효율적인 탐색 알고리즘입니다.
class BinarySearch:
    def __init__(self, sorted_data):
        self.data = sorted_data

    def find(self, target):
        left = 0
        right = len(self.data) - 1

        while left <= right:
            mid = (left + right) // 2

            if self.data[mid] == target:
                return mid
            elif self.data[mid] < target:
                left = mid + 1
            else:
                right = mid - 1

        return -1

searcher = BinarySearch([1, 3, 5, 7, 9, 11, 13])

print(searcher.find(9))
print(searcher.find(4))

코드 상세 설명

  • 이진 탐색은 반드시 데이터가 정렬되어 있어야 합니다.
  • left와 right는 현재 탐색 범위의 양끝입니다.
  • mid는 가운데 위치입니다.
  • target이 mid 값보다 크면 오른쪽 절반만 탐색합니다.
  • target이 mid 값보다 작으면 왼쪽 절반만 탐색합니다.
개념 응용 3OOP 코드정렬과 탐색

8. 상품 가격 정렬과 최저가 탐색

개념 상세 설명

상품 데이터를 가격 기준으로 정렬하면 최저가, 최고가, 가격 비교를 쉽게 할 수 있습니다.
class ProductAnalyzer:
    def __init__(self, products):
        self.products = products

    def sort_by_price(self):
        return sorted(self.products, key=lambda x: x["가격"])

    def cheapest(self):
        return self.sort_by_price()[0]

products = [
    {"상품": "노트북", "가격": 1200000},
    {"상품": "마우스", "가격": 25000},
    {"상품": "키보드", "가격": 70000}
]

analyzer = ProductAnalyzer(products)

print(analyzer.sort_by_price())
print("최저가 상품:", analyzer.cheapest())

코드 상세 설명

  • products는 상품명과 가격을 가진 딕셔너리 리스트입니다.
  • sort_by_price()는 가격이 낮은 순서로 상품을 정렬합니다.
  • cheapest()는 정렬 결과의 첫 번째 상품을 반환합니다.
  • 쇼핑몰, 가격 비교 서비스, 재고 관리에 활용할 수 있습니다.
개념 응용 4OOP 코드정렬과 탐색

9. 키워드 포함 도서 검색

개념 상세 설명

검색은 정확히 같은 값만 찾는 것이 아니라 문자열 안에 특정 키워드가 들어 있는지 찾는 방식으로도 활용됩니다.
class BookSearch:
    def __init__(self, books):
        self.books = books

    def search_keyword(self, keyword):
        return [book for book in self.books if keyword in book["제목"]]

    def sort_by_year(self):
        return sorted(self.books, key=lambda x: x["연도"])

books = [
    {"제목": "파이썬 알고리즘", "연도": 2021},
    {"제목": "자료구조 입문", "연도": 2019},
    {"제목": "알고리즘 심화", "연도": 2023}
]

library = BookSearch(books)

print(library.search_keyword("알고리즘"))
print(library.sort_by_year())

코드 상세 설명

  • keyword in book['제목']은 제목 안에 키워드가 포함되는지 확인합니다.
  • search_keyword()는 조건을 만족하는 책만 리스트로 반환합니다.
  • sort_by_year()는 출판 연도를 기준으로 오래된 책부터 정렬합니다.
  • 도서관 검색, 자료 검색, 문서 검색에 응용할 수 있습니다.
개념 응용 5OOP 코드정렬과 탐색

10. 중복 제거 후 정렬

개념 상세 설명

정렬 전에 중복을 제거하면 고유한 값만 정리할 수 있습니다. set은 중복을 제거하는 자료구조입니다.
class UniqueSorter:
    def __init__(self, data):
        self.data = data

    def unique_sorted(self):
        return sorted(set(self.data))

    def count_unique(self):
        return len(set(self.data))

numbers = UniqueSorter([3, 1, 2, 3, 2, 5, 1, 4])

print(numbers.unique_sorted())
print("고유값 개수:", numbers.count_unique())

코드 상세 설명

  • set(self.data)는 중복을 제거합니다.
  • sorted()는 중복이 제거된 값을 정렬합니다.
  • count_unique()는 고유한 값의 개수를 반환합니다.
  • 설문 응답, 상품 ID, 사용자 ID 정리에 유용합니다.
실생활 심화 1OOP 코드정렬과 탐색

11. 택배 배송 우선순위 정렬

개념 상세 설명

택배 배송에서는 긴급도와 거리처럼 여러 기준을 함께 고려해야 합니다. 튜플을 정렬 기준으로 사용하면 1차 기준, 2차 기준 정렬이 가능합니다.
class DeliveryScheduler:
    def __init__(self, orders):
        self.orders = orders

    def sort_by_priority(self):
        return sorted(
            self.orders,
            key=lambda x: (x["긴급도"], x["거리"]),
            reverse=False
        )

    def next_delivery(self):
        return self.sort_by_priority()[0]

orders = [
    {"주문번호": "A01", "긴급도": 2, "거리": 5},
    {"주문번호": "B02", "긴급도": 1, "거리": 8},
    {"주문번호": "C03", "긴급도": 1, "거리": 3}
]

scheduler = DeliveryScheduler(orders)

print(scheduler.sort_by_priority())
print("다음 배송:", scheduler.next_delivery())

코드 상세 설명

  • key=lambda x: (x['긴급도'], x['거리'])는 긴급도 우선, 거리 다음 기준입니다.
  • 긴급도 숫자가 작을수록 더 급한 주문이라고 가정합니다.
  • 긴급도가 같으면 거리가 가까운 주문이 먼저 배정됩니다.
  • 물류, 배달, 작업 스케줄링 문제에 활용됩니다.
실생활 심화 2OOP 코드정렬과 탐색

12. 병원 환자 대기열 정렬

개념 상세 설명

병원 응급실에서는 단순히 먼저 온 순서가 아니라 위급도와 도착 순서를 함께 고려해야 합니다.
class PatientQueue:
    def __init__(self, patients):
        self.patients = patients

    def sort_by_severity(self):
        return sorted(
            self.patients,
            key=lambda x: (-x["위급도"], x["도착순서"])
        )

    def next_patient(self):
        return self.sort_by_severity()[0]

patients = [
    {"이름": "환자A", "위급도": 3, "도착순서": 1},
    {"이름": "환자B", "위급도": 5, "도착순서": 2},
    {"이름": "환자C", "위급도": 5, "도착순서": 1}
]

queue = PatientQueue(patients)

print(queue.sort_by_severity())
print("다음 진료:", queue.next_patient())

코드 상세 설명

  • -x['위급도']를 사용하면 위급도가 높은 환자가 먼저 옵니다.
  • 위급도가 같으면 도착순서가 빠른 환자가 먼저입니다.
  • 튜플 정렬은 복합 기준을 자연스럽게 처리합니다.
  • 우선순위 큐 개념으로 확장할 수 있습니다.
실생활 심화 3OOP 코드정렬과 탐색

13. 검색 엔진 결과 정렬

개념 상세 설명

검색 엔진은 키워드가 포함된 문서를 찾고, 관련도 점수에 따라 높은 순서로 정렬합니다.
class SearchEngine:
    def __init__(self, pages):
        self.pages = pages

    def search(self, keyword):
        result = []
        for page in self.pages:
            if keyword in page["제목"] or keyword in page["내용"]:
                result.append(page)
        return sorted(result, key=lambda x: x["점수"], reverse=True)

pages = [
    {"제목": "파이썬 기초", "내용": "정렬과 탐색 설명", "점수": 80},
    {"제목": "알고리즘 심화", "내용": "이진 탐색과 정렬", "점수": 95},
    {"제목": "웹 디자인", "내용": "HTML CSS", "점수": 70}
]

engine = SearchEngine(pages)

print(engine.search("탐색"))

코드 상세 설명

  • 제목 또는 내용에 keyword가 들어 있으면 검색 결과에 포함됩니다.
  • 검색 결과는 점수 기준 내림차순으로 정렬됩니다.
  • 점수는 관련도, 클릭 수, 최신성 등을 종합한 값으로 볼 수 있습니다.
  • 문서 검색, 웹 검색, 추천 시스템의 기본 구조입니다.
실생활 심화 4OOP 코드정렬과 탐색

14. 성적 데이터에서 등급별 탐색과 정렬

개념 상세 설명

성적 데이터에서는 점수에 따라 등급을 만들고, 특정 등급 학생을 탐색하거나 점수순으로 정렬할 수 있습니다.
class GradeAnalyzer:
    def __init__(self, students):
        self.students = students

    def add_grade(self):
        for student in self.students:
            score = student["점수"]
            if score >= 90:
                student["등급"] = "A"
            elif score >= 80:
                student["등급"] = "B"
            else:
                student["등급"] = "C"
        return self.students

    def search_grade(self, grade):
        return [s for s in self.students if s.get("등급") == grade]

    def sort_by_score(self):
        return sorted(self.students, key=lambda x: x["점수"], reverse=True)

students = [
    {"이름": "김", "점수": 95},
    {"이름": "이", "점수": 84},
    {"이름": "박", "점수": 76},
    {"이름": "최", "점수": 91}
]

analyzer = GradeAnalyzer(students)
analyzer.add_grade()

print("A등급:", analyzer.search_grade("A"))
print("점수순:", analyzer.sort_by_score())

코드 상세 설명

  • add_grade()는 점수에 따라 A, B, C 등급을 추가합니다.
  • search_grade()는 원하는 등급의 학생만 찾습니다.
  • sort_by_score()는 점수 높은 순서로 학생을 정렬합니다.
  • 학교 성적 관리 시스템의 기본 구조입니다.
실생활 심화 5OOP 코드정렬과 탐색

15. 로그 데이터 오류 탐색과 시간 정렬

개념 상세 설명

서버나 프로그램 로그에서는 오류 상태만 탐색하고 시간순으로 정렬하여 문제 발생 시점을 파악할 수 있습니다.
class LogAnalyzer:
    def __init__(self, logs):
        self.logs = logs

    def search_error(self):
        return [log for log in self.logs if log["상태"] == "ERROR"]

    def sort_by_time(self):
        return sorted(self.logs, key=lambda x: x["시간"])

    def latest_error(self):
        errors = self.search_error()
        if not errors:
            return None
        return sorted(errors, key=lambda x: x["시간"], reverse=True)[0]

logs = [
    {"시간": "09:10", "상태": "OK", "메시지": "start"},
    {"시간": "09:15", "상태": "ERROR", "메시지": "file missing"},
    {"시간": "09:12", "상태": "OK", "메시지": "load"},
    {"시간": "09:20", "상태": "ERROR", "메시지": "timeout"}
]

analyzer = LogAnalyzer(logs)

print("오류 로그:", analyzer.search_error())
print("시간순:", analyzer.sort_by_time())
print("최근 오류:", analyzer.latest_error())

코드 상세 설명

  • search_error()는 상태가 ERROR인 로그만 찾습니다.
  • sort_by_time()은 로그를 시간순으로 정렬합니다.
  • latest_error()는 가장 최근 오류를 반환합니다.
  • 실제 서버 관리, 보안 분석, 시스템 모니터링에 활용됩니다.

🧭 전체 예제 요약표

번호구분예제핵심 내용
1기초 개념 1숫자 리스트 오름차순·내림차순 정렬정렬은 데이터를 특정 기준에 따라 순서대로 나열하는 알고리즘입니다. 오름차순은 작은 값에서 큰 값으로, 내림차순은 큰 값에서 작은 값으로 배치합니다.
2기초 개념 2문자열 알파벳순 정렬문자열도 정렬할 수 있습니다. 기본 정렬은 사전식 순서, 즉 알파벳 순서로 이루어집니다.
3기초 개념 3순차 탐색으로 값 찾기순차 탐색은 데이터를 앞에서부터 하나씩 확인하면서 목표값을 찾는 가장 기본적인 탐색 방법입니다.
4기초 개념 4최댓값과 최솟값 찾기탐색은 특정 값만 찾는 것이 아니라, 데이터 안에서 최댓값이나 최솟값을 찾는 과정도 포함합니다.
5기초 개념 5문자열 길이 기준 정렬정렬 기준은 값 자체가 아니라 길이, 점수, 날짜처럼 원하는 기준으로 바꿀 수 있습니다.
6개념 응용 1학생 점수 기준 순위 정렬딕셔너리 리스트에서는 특정 key 값을 기준으로 정렬할 수 있습니다. 학생 데이터를 점수 기준으로 정렬하면 순위를 만들 수 있습니다.
7개념 응용 2이진 탐색으로 빠르게 찾기이진 탐색은 정렬된 데이터에서 중간값을 기준으로 탐색 범위를 절반씩 줄이는 효율적인 탐색 알고리즘입니다.
8개념 응용 3상품 가격 정렬과 최저가 탐색상품 데이터를 가격 기준으로 정렬하면 최저가, 최고가, 가격 비교를 쉽게 할 수 있습니다.
9개념 응용 4키워드 포함 도서 검색검색은 정확히 같은 값만 찾는 것이 아니라 문자열 안에 특정 키워드가 들어 있는지 찾는 방식으로도 활용됩니다.
10개념 응용 5중복 제거 후 정렬정렬 전에 중복을 제거하면 고유한 값만 정리할 수 있습니다. set은 중복을 제거하는 자료구조입니다.
11실생활 심화 1택배 배송 우선순위 정렬택배 배송에서는 긴급도와 거리처럼 여러 기준을 함께 고려해야 합니다. 튜플을 정렬 기준으로 사용하면 1차 기준, 2차 기준 정렬이 가능합니다.
12실생활 심화 2병원 환자 대기열 정렬병원 응급실에서는 단순히 먼저 온 순서가 아니라 위급도와 도착 순서를 함께 고려해야 합니다.
13실생활 심화 3검색 엔진 결과 정렬검색 엔진은 키워드가 포함된 문서를 찾고, 관련도 점수에 따라 높은 순서로 정렬합니다.
14실생활 심화 4성적 데이터에서 등급별 탐색과 정렬성적 데이터에서는 점수에 따라 등급을 만들고, 특정 등급 학생을 탐색하거나 점수순으로 정렬할 수 있습니다.
15실생활 심화 5로그 데이터 오류 탐색과 시간 정렬서버나 프로그램 로그에서는 오류 상태만 탐색하고 시간순으로 정렬하여 문제 발생 시점을 파악할 수 있습니다.

🎯 심화 탐구 과제

  1. 이진 탐색 코드에 탐색 과정 출력 기능을 추가하라.
  2. 학생 점수 정렬에서 동점자는 이름순으로 정렬하도록 바꾸어라.
  3. 택배 배송 우선순위에 배송 마감 시간을 추가하라.
  4. 검색 엔진 예제에 키워드 등장 횟수 기반 점수 계산을 추가하라.
  5. 로그 분석 클래스에 WARNING 탐색과 시간 구간 필터링을 추가하라.