모든 문항은 객체지향 프로그래밍 기반 정렬과 탐색 코드입니다. 각 문항은 코드 → 출력결과 → 심화 5지선다 → 상세 풀이 순서로 구성되어 있습니다.
1. 1. 숫자 리스트 오름차순·내림차순 정렬
핵심 개념: sorted(), reverse=True, 원본 보존
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()는 원본 리스트를 직접 바꾸지 않고 새로운 정렬 리스트를 만듭니다.
이 코드에 대한 설명으로 가장 적절한 것은?
상세 풀이: NumberSorter는 숫자 리스트를 객체 내부에 저장하고, sorted()를 이용해 오름차순과 내림차순 결과를 반환합니다. sorted()는 원본 리스트를 직접 바꾸지 않고 새로운 정렬 리스트를 만듭니다.
2. 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())
['apple', 'banana', 'cherry', 'date']
['date', 'cherry', 'banana', 'apple']
문자열 리스트도 sorted()로 정렬할 수 있습니다. 기본 정렬은 사전식 순서이며 reverse=True를 사용하면 역순 정렬이 됩니다.
문자열 정렬 결과에 대한 설명으로 옳은 것은?
상세 풀이: 문자열 리스트도 sorted()로 정렬할 수 있습니다. 기본 정렬은 사전식 순서이며 reverse=True를 사용하면 역순 정렬이 됩니다.
3. 3. 순차 탐색으로 값 찾기
핵심 개념: 순차 탐색, enumerate(), 실패 시 -1
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을 반환합니다.
searcher.find(99)가 -1을 출력하는 이유로 가장 적절한 것은?
상세 풀이: 순차 탐색은 앞에서부터 하나씩 값을 비교합니다. target을 찾으면 해당 인덱스를 반환하고, 끝까지 찾지 못하면 -1을 반환합니다.
4. 4. 최댓값과 최솟값 찾기
핵심 개념: min(), max(), 탐색
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()는 가장 큰 값을 찾습니다. 최댓값과 최솟값 찾기도 탐색의 한 형태입니다.
이 코드의 실행 결과로 옳은 것은?
상세 풀이: min()은 가장 작은 값을, max()는 가장 큰 값을 찾습니다. 최댓값과 최솟값 찾기도 탐색의 한 형태입니다.
5. 5. 문자열 길이 기준 정렬
핵심 개념: key=len, max(key=len)
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)은 길이가 가장 긴 단어를 찾습니다.
key=len의 역할로 가장 적절한 것은?
상세 풀이: key=len은 문자열의 길이를 정렬 기준으로 사용합니다. max(..., key=len)은 길이가 가장 긴 단어를 찾습니다.
6. 6. 학생 점수 기준 순위 정렬
핵심 개념: 딕셔너리 리스트, lambda, 점수 내림차순
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이므로 높은 점수 순입니다.
top_student()가 반환하는 학생으로 옳은 것은?
상세 풀이: 딕셔너리 리스트는 key=lambda x: x['점수']와 같이 특정 key 값을 기준으로 정렬할 수 있습니다. reverse=True이므로 높은 점수 순입니다.
7. 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))
4
-1
이진 탐색은 정렬된 데이터에서 중간값을 기준으로 탐색 범위를 절반씩 줄입니다. 찾으면 인덱스를 반환하고 없으면 -1을 반환합니다.
이진 탐색이 올바르게 동작하기 위한 핵심 조건은?
상세 풀이: 이진 탐색은 정렬된 데이터에서 중간값을 기준으로 탐색 범위를 절반씩 줄입니다. 찾으면 인덱스를 반환하고 없으면 -1을 반환합니다.
8. 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())
[{'상품': '마우스', '가격': 25000}, {'상품': '키보드', '가격': 70000}, {'상품': '노트북', '가격': 1200000}]
최저가 상품: {'상품': '마우스', '가격': 25000}
상품 딕셔너리 리스트를 가격 기준으로 오름차순 정렬합니다. 정렬 결과의 첫 번째 항목이 최저가 상품입니다.
cheapest()의 결과로 가장 적절한 것은?
상세 풀이: 상품 딕셔너리 리스트를 가격 기준으로 오름차순 정렬합니다. 정렬 결과의 첫 번째 항목이 최저가 상품입니다.
9. 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())
[{'제목': '파이썬 알고리즘', '연도': 2021}, {'제목': '알고리즘 심화', '연도': 2023}]
[{'제목': '자료구조 입문', '연도': 2019}, {'제목': '파이썬 알고리즘', '연도': 2021}, {'제목': '알고리즘 심화', '연도': 2023}]
keyword in book['제목']은 제목 안에 특정 키워드가 포함되어 있는지 검사합니다. sort_by_year()는 연도 오름차순 정렬입니다.
search_keyword('알고리즘')의 결과에 포함되는 책은?
상세 풀이: keyword in book['제목']은 제목 안에 특정 키워드가 포함되어 있는지 검사합니다. sort_by_year()는 연도 오름차순 정렬입니다.
10. 10. 중복 제거 후 정렬
핵심 개념: set(), sorted(), 고유값 개수
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()는 중복 제거 후 남은 값의 개수를 반환합니다.
unique_sorted()의 출력으로 옳은 것은?
상세 풀이: set()은 중복을 제거하고 sorted()는 정렬합니다. count_unique()는 중복 제거 후 남은 값의 개수를 반환합니다.
11. 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())
[{'주문번호': 'C03', '긴급도': 1, '거리': 3}, {'주문번호': 'B02', '긴급도': 1, '거리': 8}, {'주문번호': 'A01', '긴급도': 2, '거리': 5}]
다음 배송: {'주문번호': 'C03', '긴급도': 1, '거리': 3}
정렬 기준이 (긴급도, 거리)이므로 먼저 긴급도 오름차순, 긴급도가 같으면 거리 오름차순으로 정렬합니다.
다음 배송으로 C03이 선택되는 이유로 가장 적절한 것은?
상세 풀이: 정렬 기준이 (긴급도, 거리)이므로 먼저 긴급도 오름차순, 긴급도가 같으면 거리 오름차순으로 정렬합니다.
12. 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())
[{'이름': '환자C', '위급도': 5, '도착순서': 1}, {'이름': '환자B', '위급도': 5, '도착순서': 2}, {'이름': '환자A', '위급도': 3, '도착순서': 1}]
다음 진료: {'이름': '환자C', '위급도': 5, '도착순서': 1}
-x['위급도']를 사용해 위급도가 높은 환자가 먼저 오게 합니다. 위급도가 같으면 도착순서가 빠른 환자가 먼저입니다.
정렬 기준 key=lambda x: (-x['위급도'], x['도착순서'])의 의미로 옳은 것은?
상세 풀이: -x['위급도']를 사용해 위급도가 높은 환자가 먼저 오게 합니다. 위급도가 같으면 도착순서가 빠른 환자가 먼저입니다.
13. 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("탐색"))
[{'제목': '알고리즘 심화', '내용': '이진 탐색과 정렬', '점수': 95}, {'제목': '파이썬 기초', '내용': '정렬과 탐색 설명', '점수': 80}]
제목 또는 내용에 키워드가 포함된 페이지를 모은 뒤 점수 높은 순으로 정렬합니다.
engine.search('탐색')의 결과 정렬에 대한 설명으로 옳은 것은?
상세 풀이: 제목 또는 내용에 키워드가 포함된 페이지를 모은 뒤 점수 높은 순으로 정렬합니다.
14. 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())
A등급: [{'이름': '김', '점수': 95, '등급': 'A'}, {'이름': '최', '점수': 91, '등급': 'A'}]
점수순: [{'이름': '김', '점수': 95, '등급': 'A'}, {'이름': '최', '점수': 91, '등급': 'A'}, {'이름': '이', '점수': 84, '등급': 'B'}, {'이름': '박', '점수': 76, '등급': 'C'}]
add_grade()는 점수에 따라 등급을 추가합니다. search_grade('A')는 A등급 학생만 찾고 sort_by_score()는 점수 높은 순으로 정렬합니다.
search_grade('A')의 결과에 포함되는 학생으로 옳은 것은?
상세 풀이: add_grade()는 점수에 따라 등급을 추가합니다. search_grade('A')는 A등급 학생만 찾고 sort_by_score()는 점수 높은 순으로 정렬합니다.
15. 15. 로그 데이터 오류 탐색과 시간 정렬
핵심 개념: ERROR 탐색, 시간 정렬, 최근 오류
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 로그를 반환합니다.
latest_error()가 반환하는 로그의 메시지로 옳은 것은?
상세 풀이: search_error()는 ERROR 로그만 찾고, sort_by_time()은 전체 로그를 시간순으로 정렬합니다. latest_error()는 가장 최근 ERROR 로그를 반환합니다.