🔎 정렬과 탐색 OOP 코드 심화형 수행평가

각 코드와 출력결과를 모두 보고, 코드 관련 심화형 5지선다형 문제를 해결합니다.

평가 안내
모든 문항은 객체지향 프로그래밍 기반 정렬과 탐색 코드입니다. 각 문항은 코드 → 출력결과 → 심화 5지선다 → 상세 풀이 순서로 구성되어 있습니다.
기초 개념 심화 5지선다

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

핵심 개념: sorted(), reverse=True, 원본 보존

🐍 파이썬 OOP 코드
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())
🖥️ 코드 출력결과
오름차순: [1, 3, 5, 8, 9]
내림차순: [9, 8, 5, 3, 1]
상세 설명
NumberSorter는 숫자 리스트를 객체 내부에 저장하고, sorted()를 이용해 오름차순과 내림차순 결과를 반환합니다. sorted()는 원본 리스트를 직접 바꾸지 않고 새로운 정렬 리스트를 만듭니다.
🎯 코드 관련 심화형 5지선다형 문제

이 코드에 대한 설명으로 가장 적절한 것은?

정답: 1번
상세 풀이: NumberSorter는 숫자 리스트를 객체 내부에 저장하고, sorted()를 이용해 오름차순과 내림차순 결과를 반환합니다. sorted()는 원본 리스트를 직접 바꾸지 않고 새로운 정렬 리스트를 만듭니다.
기초 개념 심화 5지선다

2. 2. 문자열 알파벳순 정렬

핵심 개념: 문자열 정렬, 사전식 순서

🐍 파이썬 OOP 코드
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())
🖥️ 코드 출력결과
['apple', 'banana', 'cherry', 'date']
['date', 'cherry', 'banana', 'apple']
상세 설명
문자열 리스트도 sorted()로 정렬할 수 있습니다. 기본 정렬은 사전식 순서이며 reverse=True를 사용하면 역순 정렬이 됩니다.
🎯 코드 관련 심화형 5지선다형 문제

문자열 정렬 결과에 대한 설명으로 옳은 것은?

정답: 1번
상세 풀이: 문자열 리스트도 sorted()로 정렬할 수 있습니다. 기본 정렬은 사전식 순서이며 reverse=True를 사용하면 역순 정렬이 됩니다.
기초 개념 심화 5지선다

3. 3. 순차 탐색으로 값 찾기

핵심 개념: 순차 탐색, enumerate(), 실패 시 -1

🐍 파이썬 OOP 코드
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))
🖥️ 코드 출력결과
2
-1
상세 설명
순차 탐색은 앞에서부터 하나씩 값을 비교합니다. target을 찾으면 해당 인덱스를 반환하고, 끝까지 찾지 못하면 -1을 반환합니다.
🎯 코드 관련 심화형 5지선다형 문제

searcher.find(99)가 -1을 출력하는 이유로 가장 적절한 것은?

정답: 1번
상세 풀이: 순차 탐색은 앞에서부터 하나씩 값을 비교합니다. target을 찾으면 해당 인덱스를 반환하고, 끝까지 찾지 못하면 -1을 반환합니다.
기초 개념 심화 5지선다

4. 4. 최댓값과 최솟값 찾기

핵심 개념: min(), max(), 탐색

🐍 파이썬 OOP 코드
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())
🖥️ 코드 출력결과
최솟값: 17
최댓값: 88
상세 설명
min()은 가장 작은 값을, max()는 가장 큰 값을 찾습니다. 최댓값과 최솟값 찾기도 탐색의 한 형태입니다.
🎯 코드 관련 심화형 5지선다형 문제

이 코드의 실행 결과로 옳은 것은?

정답: 1번
상세 풀이: min()은 가장 작은 값을, max()는 가장 큰 값을 찾습니다. 최댓값과 최솟값 찾기도 탐색의 한 형태입니다.
기초 개념 심화 5지선다

5. 5. 문자열 길이 기준 정렬

핵심 개념: key=len, max(key=len)

🐍 파이썬 OOP 코드
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())
🖥️ 코드 출력결과
['AI', 'Data', 'Python', 'Algorithm']
가장 긴 단어: Algorithm
상세 설명
key=len은 문자열의 길이를 정렬 기준으로 사용합니다. max(..., key=len)은 길이가 가장 긴 단어를 찾습니다.
🎯 코드 관련 심화형 5지선다형 문제

key=len의 역할로 가장 적절한 것은?

정답: 1번
상세 풀이: key=len은 문자열의 길이를 정렬 기준으로 사용합니다. max(..., key=len)은 길이가 가장 긴 단어를 찾습니다.
개념 응용 심화 5지선다

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

핵심 개념: 딕셔너리 리스트, lambda, 점수 내림차순

🐍 파이썬 OOP 코드
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())
🖥️ 코드 출력결과
[{'이름': '이지은', '점수': 95}, {'이름': '김민수', '점수': 88}, {'이름': '박서준', '점수': 76}]
1등: {'이름': '이지은', '점수': 95}
상세 설명
딕셔너리 리스트는 key=lambda x: x['점수']와 같이 특정 key 값을 기준으로 정렬할 수 있습니다. reverse=True이므로 높은 점수 순입니다.
🎯 코드 관련 심화형 5지선다형 문제

top_student()가 반환하는 학생으로 옳은 것은?

정답: 1번
상세 풀이: 딕셔너리 리스트는 key=lambda x: x['점수']와 같이 특정 key 값을 기준으로 정렬할 수 있습니다. reverse=True이므로 높은 점수 순입니다.
개념 응용 심화 5지선다

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

핵심 개념: 이진 탐색, 정렬된 데이터, 탐색 범위 절반 축소

🐍 파이썬 OOP 코드
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))
🖥️ 코드 출력결과
4
-1
상세 설명
이진 탐색은 정렬된 데이터에서 중간값을 기준으로 탐색 범위를 절반씩 줄입니다. 찾으면 인덱스를 반환하고 없으면 -1을 반환합니다.
🎯 코드 관련 심화형 5지선다형 문제

이진 탐색이 올바르게 동작하기 위한 핵심 조건은?

정답: 1번
상세 풀이: 이진 탐색은 정렬된 데이터에서 중간값을 기준으로 탐색 범위를 절반씩 줄입니다. 찾으면 인덱스를 반환하고 없으면 -1을 반환합니다.
개념 응용 심화 5지선다

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

핵심 개념: 가격 기준 정렬, 최저가 탐색

🐍 파이썬 OOP 코드
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())
🖥️ 코드 출력결과
[{'상품': '마우스', '가격': 25000}, {'상품': '키보드', '가격': 70000}, {'상품': '노트북', '가격': 1200000}]
최저가 상품: {'상품': '마우스', '가격': 25000}
상세 설명
상품 딕셔너리 리스트를 가격 기준으로 오름차순 정렬합니다. 정렬 결과의 첫 번째 항목이 최저가 상품입니다.
🎯 코드 관련 심화형 5지선다형 문제

cheapest()의 결과로 가장 적절한 것은?

정답: 1번
상세 풀이: 상품 딕셔너리 리스트를 가격 기준으로 오름차순 정렬합니다. 정렬 결과의 첫 번째 항목이 최저가 상품입니다.
개념 응용 심화 5지선다

9. 9. 키워드 포함 도서 검색

핵심 개념: 문자열 포함 검색, 연도 정렬

🐍 파이썬 OOP 코드
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())
🖥️ 코드 출력결과
[{'제목': '파이썬 알고리즘', '연도': 2021}, {'제목': '알고리즘 심화', '연도': 2023}]
[{'제목': '자료구조 입문', '연도': 2019}, {'제목': '파이썬 알고리즘', '연도': 2021}, {'제목': '알고리즘 심화', '연도': 2023}]
상세 설명
keyword in book['제목']은 제목 안에 특정 키워드가 포함되어 있는지 검사합니다. sort_by_year()는 연도 오름차순 정렬입니다.
🎯 코드 관련 심화형 5지선다형 문제

search_keyword('알고리즘')의 결과에 포함되는 책은?

정답: 1번
상세 풀이: keyword in book['제목']은 제목 안에 특정 키워드가 포함되어 있는지 검사합니다. sort_by_year()는 연도 오름차순 정렬입니다.
개념 응용 심화 5지선다

10. 10. 중복 제거 후 정렬

핵심 개념: set(), sorted(), 고유값 개수

🐍 파이썬 OOP 코드
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())
🖥️ 코드 출력결과
[1, 2, 3, 4, 5]
고유값 개수: 5
상세 설명
set()은 중복을 제거하고 sorted()는 정렬합니다. count_unique()는 중복 제거 후 남은 값의 개수를 반환합니다.
🎯 코드 관련 심화형 5지선다형 문제

unique_sorted()의 출력으로 옳은 것은?

정답: 1번
상세 풀이: set()은 중복을 제거하고 sorted()는 정렬합니다. count_unique()는 중복 제거 후 남은 값의 개수를 반환합니다.
실생활 심화 심화 5지선다

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

핵심 개념: 튜플 기준 정렬, 1차·2차 기준

🐍 파이썬 OOP 코드
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())
🖥️ 코드 출력결과
[{'주문번호': 'C03', '긴급도': 1, '거리': 3}, {'주문번호': 'B02', '긴급도': 1, '거리': 8}, {'주문번호': 'A01', '긴급도': 2, '거리': 5}]
다음 배송: {'주문번호': 'C03', '긴급도': 1, '거리': 3}
상세 설명
정렬 기준이 (긴급도, 거리)이므로 먼저 긴급도 오름차순, 긴급도가 같으면 거리 오름차순으로 정렬합니다.
🎯 코드 관련 심화형 5지선다형 문제

다음 배송으로 C03이 선택되는 이유로 가장 적절한 것은?

정답: 1번
상세 풀이: 정렬 기준이 (긴급도, 거리)이므로 먼저 긴급도 오름차순, 긴급도가 같으면 거리 오름차순으로 정렬합니다.
실생활 심화 심화 5지선다

12. 12. 병원 환자 대기열 정렬

핵심 개념: 복합 기준, -위급도, 도착순서

🐍 파이썬 OOP 코드
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())
🖥️ 코드 출력결과
[{'이름': '환자C', '위급도': 5, '도착순서': 1}, {'이름': '환자B', '위급도': 5, '도착순서': 2}, {'이름': '환자A', '위급도': 3, '도착순서': 1}]
다음 진료: {'이름': '환자C', '위급도': 5, '도착순서': 1}
상세 설명
-x['위급도']를 사용해 위급도가 높은 환자가 먼저 오게 합니다. 위급도가 같으면 도착순서가 빠른 환자가 먼저입니다.
🎯 코드 관련 심화형 5지선다형 문제

정렬 기준 key=lambda x: (-x['위급도'], x['도착순서'])의 의미로 옳은 것은?

정답: 1번
상세 풀이: -x['위급도']를 사용해 위급도가 높은 환자가 먼저 오게 합니다. 위급도가 같으면 도착순서가 빠른 환자가 먼저입니다.
실생활 심화 심화 5지선다

13. 13. 검색 엔진 결과 정렬

핵심 개념: 키워드 검색, 관련도 점수 내림차순

🐍 파이썬 OOP 코드
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("탐색"))
🖥️ 코드 출력결과
[{'제목': '알고리즘 심화', '내용': '이진 탐색과 정렬', '점수': 95}, {'제목': '파이썬 기초', '내용': '정렬과 탐색 설명', '점수': 80}]
상세 설명
제목 또는 내용에 키워드가 포함된 페이지를 모은 뒤 점수 높은 순으로 정렬합니다.
🎯 코드 관련 심화형 5지선다형 문제

engine.search('탐색')의 결과 정렬에 대한 설명으로 옳은 것은?

정답: 1번
상세 풀이: 제목 또는 내용에 키워드가 포함된 페이지를 모은 뒤 점수 높은 순으로 정렬합니다.
실생활 심화 심화 5지선다

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

핵심 개념: 등급 추가, 조건 탐색, 점수 정렬

🐍 파이썬 OOP 코드
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())
🖥️ 코드 출력결과
A등급: [{'이름': '김', '점수': 95, '등급': 'A'}, {'이름': '최', '점수': 91, '등급': 'A'}]
점수순: [{'이름': '김', '점수': 95, '등급': 'A'}, {'이름': '최', '점수': 91, '등급': 'A'}, {'이름': '이', '점수': 84, '등급': 'B'}, {'이름': '박', '점수': 76, '등급': 'C'}]
상세 설명
add_grade()는 점수에 따라 등급을 추가합니다. search_grade('A')는 A등급 학생만 찾고 sort_by_score()는 점수 높은 순으로 정렬합니다.
🎯 코드 관련 심화형 5지선다형 문제

search_grade('A')의 결과에 포함되는 학생으로 옳은 것은?

정답: 1번
상세 풀이: add_grade()는 점수에 따라 등급을 추가합니다. search_grade('A')는 A등급 학생만 찾고 sort_by_score()는 점수 높은 순으로 정렬합니다.
실생활 심화 심화 5지선다

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

핵심 개념: ERROR 탐색, 시간 정렬, 최근 오류

🐍 파이썬 OOP 코드
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())
🖥️ 코드 출력결과
오류 로그: [{'시간': '09:15', '상태': 'ERROR', '메시지': 'file missing'}, {'시간': '09:20', '상태': 'ERROR', '메시지': 'timeout'}]
시간순: [{'시간': '09:10', '상태': 'OK', '메시지': 'start'}, {'시간': '09:12', '상태': 'OK', '메시지': 'load'}, {'시간': '09:15', '상태': 'ERROR', '메시지': 'file missing'}, {'시간': '09:20', '상태': 'ERROR', '메시지': 'timeout'}]
최근 오류: {'시간': '09:20', '상태': 'ERROR', '메시지': 'timeout'}
상세 설명
search_error()는 ERROR 로그만 찾고, sort_by_time()은 전체 로그를 시간순으로 정렬합니다. latest_error()는 가장 최근 ERROR 로그를 반환합니다.
🎯 코드 관련 심화형 5지선다형 문제

latest_error()가 반환하는 로그의 메시지로 옳은 것은?

정답: 1번
상세 풀이: search_error()는 ERROR 로그만 찾고, sort_by_time()은 전체 로그를 시간순으로 정렬합니다. latest_error()는 가장 최근 ERROR 로그를 반환합니다.