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모든 요청이 완료되었습니다.")