파이썬

[파이썬] 숙소 예약 프로그램 만들기

Nohsw 2023. 12. 26. 22:46
import json
from random import randint, choice

hotel_floor = {}
reserved_rooms = []

# 각 층에 대한 초기화
for floor in range(1, 4):
    hotel_floor[floor] = {"status": "층 수: {0}층".format(floor), "rooms": {}}
    
    # 각 방에 대한 초기화
    for room in range(1, 6):
        hotel_floor[floor]["rooms"][room] = {"status": "방 번호: " + str(room).zfill(3), "reserved": False}

# 파일에서 예약된 방 정보 불러오기
def load_reserved_rooms():
    try:
        with open("reserved_rooms.json", "r") as file:
            data = json.load(file)
            return data if data else []
    except FileNotFoundError:
        return []

# 예약된 방 정보 저장하기
def save_reserved_rooms():
    with open("reserved_rooms.json", "w") as file:
        json.dump(reserved_rooms, file)

# 랜덤으로 방 예약하는 함수
def reserve_random_room():
    available_rooms = set()

    # 예약 가능한 방 찾기
    for floor_number, floor in hotel_floor.items():
        for room, room_info in floor["rooms"].items():
            if not room_info["reserved"]:
                available_rooms.add((floor_number, room))

    # 이미 예약된 방이 모든 방인 경우 예약을 거부
    if not available_rooms:
        print("예약 가능한 방이 없습니다.")
        return None, None

    # 랜덤으로 방 선택
    random_floor, random_room = choice(list(available_rooms))

    # 예약 처리
    guest_room = hotel_floor[random_floor]["rooms"][random_room]
    
    # 이미 예약된 방인지 확인
    if guest_room["reserved"]:
        print("이미 예약된 방입니다. 예약을 거부합니다.")
        return None, None

    guest_room["reserved"] = True
    reserved_rooms.append({"floor": random_floor, "room_info": guest_room})
    save_reserved_rooms()  # 예약된 방 정보를 저장
    return random_floor, random_room

# 프로그램 실행 시 예약된 방 정보 불러오기
reserved_rooms = load_reserved_rooms()

# 예약된 방 정보 출력 시 중복 방을 방지하기 위해 set으로 변환
unique_reserved_rooms = set(map(lambda x: (x.get("floor", "알 수 없음"), x.get("room_info", {}).get("status", "알 수 없음")), reserved_rooms))

# 예약된 방의 정보를 층수 별로 정렬
reserved_rooms_sorted = sorted(reserved_rooms, key=lambda x: x["floor"])

# 예약 진행
reserved_floor, reserved_room = reserve_random_room()
if reserved_floor is not None and reserved_room is not None:
    print("\n예약 완료! {0}층 {1}번 방이 예약되었습니다.".format(reserved_floor, reserved_room))

# hotel_floor 업데이트
for room_info in reserved_rooms:
    floor = room_info["floor"]
    room_status = room_info["room_info"]["status"]  # 수정된 부분
    room_number = int(room_status.split(":")[1].strip())  # 수정된 부분
    hotel_floor[floor]["rooms"][room_number]["reserved"] = True

# 예약된 방 정보 출력
print("\n예약된 방 정보:")
for room_info in unique_reserved_rooms:
    floor = room_info[0]
    room_status = room_info[1]
    print("층 수: {0}, {1} [R]".format(floor, room_status))
print()

# 각 방의 정보 출력
for floor, info in hotel_floor.items():
    print(info["status"])  # 층에 대한 정보 출력
    
    # 각 방의 정보 출력
    for room, room_info in info["rooms"].items():
        status = "[R]" if room_info["reserved"] else ""
        print(room_info["status"] + " " + status)  # 해당 층의 각 방에 대한 정보 및 예약 여부 출력
    print()  # 각 층 사이에 빈 줄 출력

파이썬으로 숙소 예약 프로그램을 만들어보고 있다.

약간의 버그가 있지만 chatGPT의 도움을 받아 코드를 작성해보고 있다.

오늘은 여기까지 작성해보고 휴대폰으로 코드를 분석해보며 정리를 하는 시간을 가지고 내일은 버그가 있는 부분을 수정하여 완벽한 프로그램을 만들어보려고 한다.

버그 내용은 [R] 부분은 예약이 된 방이기 때문에 랜덤함수를 이용하여 방이 결정되었을 때 예약된 방이면 비어있는 다른 방으로 예약이 되야하고, 안내 문구에도 사용자에게 다른 방으로 예약이 되었다고 안내 해줘야하는데 예약된 방으로 계속 예약 완료로 나오는 버그가 있다.

몇시간 째 찾아보았지만 해결을 하지 못해 잠들기 전까지 모바일로 테스트하며 버그를 찾을 예정이다.

오늘은 여기까지 작성해보고 쉬어야겠다.