카테고리 없음

[GURU1] 20260728 QUIZ

gamtwistealer 2026. 7. 28. 09:57

 

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개