검색 기능
Coddy Python 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 64개 중 58번째.
챌린지
중급이 챌린지에서는 도서 검색 기능이 포함된 도서관 관리 시스템을 구현합니다.
세 개의 수정 가능한 파일로 작업하게 됩니다:
book.py- Book 클래스 정의를 포함합니다user.py- User 클래스 정의를 포함합니다library.py- 검색 기능을 구현할 Library 클래스를 포함합니다
각 파일의 TODO 주석을 따라 필요한 기능을 구현하세요. 주요 과제는 도서 제목에 대해 대소문자를 구분하지 않는 검색을 수행하는 search_by_title 메서드를 Library 클래스에 추가하는 것입니다.
치트 시트
이 챌린지는 세 가지 주요 구성 요소로 이루어진 도서 관리 시스템을 구현하는 데 중점을 둡니다:
- Book 클래스 - 시스템 내의 개별 도서를 나타냅니다
- User 클래스 - 도서관 사용자를 나타냅니다
- Library 클래스 - 도서를 관리하고 검색 기능을 제공합니다
구현해야 할 핵심 기능은 도서 제목에 대해 대소문자를 구분하지 않는 검색을 수행하는 search_by_title 메서드입니다.
직접 해보기
from book import Book
from user import User
from library import Library
import time
# 종합 테스트 케이스 처리기
test_case = input()
if test_case == "search_match":
library = Library("Community Library")
# 도서 몇 권 추가
library.add_book(Book("The Great Gatsby", "F. Scott Fitzgerald", "123456"))
library.add_book(Book("To Kill a Mockingbird", "Harper Lee", "789012"))
library.add_book(Book("Great Expectations", "Charles Dickens", "345678"))
# 도서 검색
search_term = "great"
found_books = library.search_by_title(search_term)
print(f"Found {len(found_books)} books matching '{search_term}':")
for book in found_books:
print(f"- {book.title} by {book.author}")
elif test_case == "search_no_match":
library = Library("Community Library")
# 도서 몇 권 추가
library.add_book(Book("The Great Gatsby", "F. Scott Fitzgerald", "123456"))
library.add_book(Book("To Kill a Mockingbird", "Harper Lee", "789012"))
# 도서 검색
search_term = "nonexistent"
found_books = library.search_by_title(search_term)
print(f"Found {len(found_books)} books matching '{search_term}'")
elif test_case == "case_insensitive":
library = Library("Community Library")
# 도서 몇 권 추가
library.add_book(Book("The Great Gatsby", "F. Scott Fitzgerald", "123456"))
library.add_book(Book("To Kill a Mockingbird", "Harper Lee", "789012"))
# 대소문자를 구분하여 검색
search_terms = ["GREAT", "great", "Great", "gReAt"]
for term in search_terms:
found_books = library.search_by_title(term)
print(f"Search for '{term}': {len(found_books)} book(s) found")
elif test_case == "empty_search":
library = Library("Community Library")
# 도서 몇 권 추가
library.add_book(Book("The Great Gatsby", "F. Scott Fitzgerald", "123456"))
library.add_book(Book("To Kill a Mockingbird", "Harper Lee", "789012"))
library.add_book(Book("Great Expectations", "Charles Dickens", "345678"))
# 빈 문자열로 검색
search_term = ""
found_books = library.search_by_title(search_term)
print(f"Empty search returned {len(found_books)} books (should be all books)")
print(f"Library has {len(library.books)} total books")
elif test_case == "empty_library":
library = Library("Empty Library")
# 빈 도서관에서 검색
search_term = "anything"
found_books = library.search_by_title(search_term)
print(f"Search in empty library returned {len(found_books)} books")
elif test_case == "special_characters":
library = Library("Special Characters Library")
# 특수 문자가 포함된 도서 추가
library.add_book(Book("Harry Potter & the Sorcerer's Stone", "J.K. Rowling", "111111"))
library.add_book(Book("The C++ Programming Language", "Bjarne Stroustrup", "222222"))
library.add_book(Book("The !@#$%^& Book", "Special Author", "333333"))
# 특수 문자로 검색
special_terms = ["&", "++", "!@#"]
for term in special_terms:
found_books = library.search_by_title(term)
print(f"Search for '{term}': {len(found_books)} book(s) found")
for book in found_books:
print(f"- {book.title}")
elif test_case == "performance_test":
library = Library("Large Library")
# 많은 도서 추가 (100권)
for i in range(1, 101):
if i % 10 == 0: # 매 10번째 도서 제목에 "performance" 포함
library.add_book(Book(f"Performance Book #{i}", f"Author {i}", str(i)))
else:
library.add_book(Book(f"Book #{i}", f"Author {i}", str(i)))
# 검색 시간 측정
start_time = time.time()
search_term = "performance"
found_books = library.search_by_title(search_term)
end_time = time.time()
print(f"Found {len(found_books)} books with '{search_term}' in the title")
print(f"Search took {end_time - start_time:.6f} seconds")
print(f"First matching book: {found_books[0].title if found_books else 'None'}")