

class Library:
def __init__(self, book_count):
# 도서관에 있는 전체 책의 수
self.book_count = book_count
# 각 책의 대출 상태를 저장하는 리스트
# 0이면 대출 가능, 학번이면 대출 중
self.books = [0] * book_count
def borrow_book(self, student_id, book_number):
# 책 번호는 1번부터 시작하므로 리스트 인덱스는 1을 뺌
index = book_number - 1
# 해당 책이 대출 가능한지 확인
if self.books[index] == 0:
# 대출 가능하면 학생의 학번으로 변경
self.books[index] = student_id
# 대출 완료 메시지 출력
print(f"[ {student_id} ] {book_number} 번 도서 대출 완료")
else:
# 이미 대출 중이면 메시지 출력
print(f"{book_number} 번 도서는 대출 중입니다.")
def return_book(self, book_number):
# 책 번호는 1번부터 시작하므로 리스트 인덱스는 1을 뺌
index = book_number - 1
# 해당 책이 대출 중인지 확인
if self.books[index] != 0:
# 대출 중인 책이면 0으로 변경하여 반납 처리
self.books[index] = 0
# 반납 완료 메시지 출력
print(f"{book_number} 번 도서 반납 완료")
else:
# 대출되지 않은 책이면 메시지 출력
print(f"{book_number} 번 도서는 대출되지 않았습니다.")
def show_status(self):
# 대출 가능한 책의 수를 저장할 변수
available_count = 0
# 모든 책의 대출 상태 확인
for book in self.books:
# 상태가 0이면 대출 가능
if book == 0:
available_count += 1
# 현재 대출 가능한 책의 수 출력
print(f"현재 대출 가능 도서: {available_count} 권")
# 도서관에 책 5권 생성
library = Library(5)
# 20260001 학생이 2번 도서 대출
library.borrow_book(20260001, 2)
# 20260002 학생이 4번 도서 대출
library.borrow_book(20260002, 4)
# 20260003 학생이 2번 도서 대출 시도
library.borrow_book(20260003, 2)
# 2번 도서 반납
library.return_book(2)
# 3번 도서 반납 시도
library.return_book(3)
# 현재 대출 가능한 도서 수 확인
library.show_status()




# 음료 가격을 문자열로 입력받음
prices = input("음료 가격을 입력하세요: ")
# 적립된 스탬프 개수를 저장
stamp = 0
# 10,000원 이상 이벤트가 이미 적용되었는지 확인
event = False
# 입력받은 가격을 쉼표(,) 기준으로 나눔
parts = prices.split(",")
# 음료 가격을 정수로 저장할 빈 리스트 생성
price_list = []
# 나눈 각각의 가격을 하나씩 확인
for p in parts:
# 문자열로 입력된 가격을 정수로 변환하여 리스트에 추가
price_list.append(int(p))
# 구매한 음료의 가격을 하나씩 확인
for price in price_list:
# 가격이 5,000원 이상이면 스탬프 2개 적립
if price >= 5000:
stamp += 2
# 가격이 5,000원 미만이면 스탬프 1개 적립
else:
stamp += 1
# 가격이 10,000원 이상이고
# 아직 10,000원 이상 음료 이벤트를 적용하지 않았다면
if price >= 10000 and not event:
# 이벤트 스탬프 3개 추가 적립
stamp += 3
# 이벤트를 이미 적용했다는 표시
event = True
# 구매한 음료 중 가장 비싼 음료가 15,000원 이상인지 확인
if max(price_list) >= 15000:
# VIP 이벤트로 스탬프 1개 추가 적립
stamp += 1
# 구매한 모든 음료의 가격을 더하여 총 구매 금액 계산
total = sum(price_list)
# 총 구매 금액 출력
print(total)
# 최종 적립된 스탬프 개수 출력
print(stamp)



class ParcelLocker:
def __init__(self, locker_count):
self.locker_count = locker_count
self.lockers = []
# 입력받은 보관함 개수만큼 0(빈 보관함)으로 리스트 초기화
for _ in range(locker_count):
self.lockers.append(0) # #1: 비어있는 보관함은 0으로 채움
def store_parcel(self, student_id):
# 이미 택배가 보관 중인 학생인지 검사
if student_id in self.lockers:
print("[", student_id, "] 이미 보관 중인 택배가 있습니다.")
return
# 앞에서부터 비어 있는 보관함(0)을 탐색하여 택배 배정
for i in range(self.locker_count):
if self.lockers[i] == 0: # #2: 보관함이 비어있는지 확인
self.lockers[i] = student_id
print("[", student_id, "]", i + 1, "번 보관함 배정 완료")
return
# 모든 보관함이 차 있는 경우
print("사용 가능한 보관함이 없습니다.")
def receive_parcel(self, student_id):
# 해당 학생의 택배가 보관함에 있는지 확인
if student_id in self.lockers:
# #3: 학생 학번이 위치한 보관함의 인덱스 번호를 찾음
locker_index = self.lockers.index(student_id)
# 택배 수령 처리 (해당 보관함을 다시 비어있는 상태인 0으로 변경)
self.lockers[locker_index] = 0
print("[", student_id, "]", locker_index + 1, "번 택배 수령 완료")
else:
print("[", student_id, "] 보관 중인 택배가 없습니다.")
def show_status(self):
# #4: 리스트 내 0의 개수를 카운트하여 현재 사용 가능한(비어있는) 보관함 수 계산
available = self.lockers.count(0)
print("현재 사용 가능한 보관함:", available, "개")
# --- 실행 및 테스트 코드 ---
# 3개의 보관함을 갖는 무인 택배함 객체 생성
parcel_locker = ParcelLocker(3)
# 택배 보관 요청
parcel_locker.store_parcel(20260001) # 1번 보관함 배정
parcel_locker.store_parcel(20260002) # 2번 보관함 배정
parcel_locker.store_parcel(20260001) # 이미 보관 중 예외 처리
parcel_locker.store_parcel(20260003) # 3번 보관함 배정
parcel_locker.store_parcel(20260004) # 보관함 가득 참 예외 처리
# 택배 수령 요청
parcel_locker.receive_parcel(20260002) # 2번 보관함 수령 완료
parcel_locker.receive_parcel(20260005) # 보관 중인 택배 없음 예외 처리
# 현재 보관함 상태 출력
parcel_locker.show_status() # 사용 가능한 보관함: 1개
