84 엘리베이터 시뮬레이터 (Elevator Simulator)
엘리베이터의 동작 과정을 시뮬레이션해 봅시다. 단순히 층을 이동하는 것 이상으로, 여러 층에서 동시에 버튼을 눌렀을 때 어느 층으로 먼저 갈 것인지, 올라가는 중이나 내려가는 중에 어떻게 멈출지 등 복잡한 알고리즘을 고민하고 설계하는 과정이 핵심입니다.
이 프로젝트는 효율적인 제어 로직과 상태 머신(State Machine)을 이해하는 데 아주 좋습니다. 승객의 대기 시간을 줄이고 에너지 효율을 높이는 최적의 엘리베이터 이동 규칙을 직접 코드로 구현해 보세요.
84.1 주요 개발 포인트
- 엘리베이터 상태 관리: 현재 층, 이동 방향(위/아래), 문 열림/닫힘 상태 등을 관리합니다.
- 요청 처리 스케줄링: 여러 층의 호출 버튼을 받아 최적의 경로로 층을 방문하는 알고리즘을 설계합니다.
- 우선순위 로직: 올라가는 도중 같은 방향의 호출이 오면 멈추고 가기, 또는 특정 층을 우선 방문하기 등의 규칙을 적용합니다.
- 시각화 (Visual Simulation): 각 층의 상태와 엘리베이터의 실시간 위치를 그래픽이나 텍스트로 보여줍니다.
- 다수 엘리베이터 시스템: 한 건물에 여러 대의 엘리베이터가 있을 때 가장 가까운 엘리베이터를 배차하는 시스템으로 확장합니다.
84.2 Python 구현 예시 (간단한 엘리베이터 이동 시뮬레이션)
import time
class Elevator:
"""
엘리베이터의 현재 상태와 이동 로직을 관리합니다.
"""
def __init__(self, total_floors=10):
self.current_floor = 1
self.total_floors = total_floors
self.requests = []
def request_floor(self, floor):
"""
사용자가 특정 층을 누르면 대기열에 추가합니다.
"""
if 1 <= floor <= self.total_floors:
if floor not in self.requests:
self.requests.append(floor)
self.requests.sort() # 간단하게 층별로 정렬하여 방문
print(f"{floor}층 호출이 접수되었습니다.")
else:
print(f"존재하지 않는 층입니다: {floor}")
def move(self):
"""
대기열에 있는 층으로 하나씩 이동합니다.
"""
while self.requests:
target_floor = self.requests.pop(0) # 가장 낮은 층부터 순서대로
print(f"\n현재 층: {self.current_floor}층. {target_floor}층으로 이동 중...")
while self.current_floor != target_floor:
# 위 또는 아래로 한 층씩 이동
if self.current_floor < target_floor:
self.current_floor += 1
else:
self.current_floor -= 1
time.sleep(0.5) # 이동 시간 시뮬레이션
print(f"지나가는 중... {self.current_floor}층")
print(f"딩동! {target_floor}층에 도착했습니다. 문이 열립니다.")
time.sleep(1) # 문 열려 있는 시간
print("문이 닫힙니다.")
if __name__ == "__main__":
my_elevator = Elevator(total_floors=10)
# 3층, 7층, 2층 순서대로 호출
my_elevator.request_floor(3)
my_elevator.request_floor(7)
my_elevator.request_floor(2)
my_elevator.move()
print("\n모든 요청이 완료되었습니다.")