[oop] 아마존 인터뷰 질문 : OO 주차장 설계 [닫힘]

OO 주차장을 설계합니다. 어떤 클래스와 기능을 갖습니다. 꽉 차 있고 비어 있고 발렛 주차 공간도 찾을 수 있어야합니다. 주차장에는 일반, 장애인 및 소형 주차의 3 가지 유형이 있습니다.

감사!



답변

다음은 기어를 돌리는 빠른 시작입니다 …

ParkingLot는 클래스입니다.

ParkingSpace는 클래스입니다.

ParkingSpace에는 입구가 있습니다.

입구에는 위치 또는 더 구체적으로 입구와의 거리가 있습니다.

ParkingLotSign은 클래스입니다.

ParkingLot에는 ParkingLotSign이 있습니다.

ParkingLot에는 제한된 수의 ParkingSpace가 있습니다.

HandicappedParkingSpace는 ParkingSpace의 하위 클래스입니다.

RegularParkingSpace는 ParkingSpace의 하위 클래스입니다.

CompactParkingSpace는 ParkingSpace의 하위 클래스입니다.

ParkingLot는 ParkingSpaces의 배열을 유지하고 입구로부터의 거리순으로 별도의 빈 ParkingSpaces 배열을 유지합니다.

ParkingLotSign은 .Full (), .Empty () 또는 .Normal ()을 호출하여 “full”, “empty”또는 “blank / normal / partially occupied”를 표시하도록 지시 할 수 있습니다.

Parker는 클래스입니다.

Parker는 Park ()를 사용할 수 있습니다.

Parker는 Unpark () 할 수 있습니다.

Valet는 ParkingSpace를 반환하는 ParkingLot.FindVacantSpaceNearestEntrance ()를 호출 할 수있는 Parker의 하위 클래스입니다.

Parker에는 ParkingSpace가 있습니다.

Parker는 ParkingSpace.Take () 및 ParkingSpace.Vacate ()를 호출 할 수 있습니다.

Parker는 Entrance.Entering () 및 Entrance.Exiting ()을 호출하고 ParkingSpace는 ParkingLot가 차가 찼거나 비었을 때 ParkingLot에 알림을 보내 ParkingLot가 가득 차 있는지 여부를 결정할 수 있도록합니다. 새로 꽉 찼거나 새로 비어 있거나 새로 꽉 찼거나 비어 있지 않은 경우 ParkingLotSign.Full () 또는 ParkingLotSign.Empty () 또는 ParkingLotSign.Normal ()을 변경해야합니다.

HandicappedParker는 Parker의 하위 클래스이고 CompactParker는 Parker의 하위 클래스이고 RegularParker는 Parker의 하위 클래스 일 수 있습니다. (실제로 과잉 일 수 있습니다.)

이 솔루션에서는 Parker의 이름을 Car로 변경해야 할 수 있습니다.


답변

public class ParkingLot
{
    Vector<ParkingSpace> vacantParkingSpaces = null;
    Vector<ParkingSpace> fullParkingSpaces = null;

    int parkingSpaceCount = 0;

    boolean isFull;
    boolean isEmpty;

    ParkingSpace findNearestVacant(ParkingType type)
    {
        Iterator<ParkingSpace> itr = vacantParkingSpaces.iterator();

        while(itr.hasNext())
        {
            ParkingSpace parkingSpace = itr.next();

            if(parkingSpace.parkingType == type)
            {
                return parkingSpace;
            }
        }
        return null;
    }

    void parkVehicle(ParkingType type, Vehicle vehicle)
    {
        if(!isFull())
        {
            ParkingSpace parkingSpace = findNearestVacant(type);

            if(parkingSpace != null)
            {
                parkingSpace.vehicle = vehicle;
                parkingSpace.isVacant = false;

                vacantParkingSpaces.remove(parkingSpace);
                fullParkingSpaces.add(parkingSpace);

                if(fullParkingSpaces.size() == parkingSpaceCount)
                    isFull = true;

                isEmpty = false;
            }
        }
    }

    void releaseVehicle(Vehicle vehicle)
    {
        if(!isEmpty())
        {
            Iterator<ParkingSpace> itr = fullParkingSpaces.iterator();

            while(itr.hasNext())
            {
                ParkingSpace parkingSpace = itr.next();

                if(parkingSpace.vehicle.equals(vehicle))
                {
                    fullParkingSpaces.remove(parkingSpace);
                    vacantParkingSpaces.add(parkingSpace);

                    parkingSpace.isVacant = true;
                    parkingSpace.vehicle = null;

                    if(vacantParkingSpaces.size() == parkingSpaceCount)
                        isEmpty = true;

                    isFull = false;
                }
            }
        }
    }

    boolean isFull()
    {
        return isFull;
    }

    boolean isEmpty()
    {
        return isEmpty;
    }
}

public class ParkingSpace
{
    boolean isVacant;
    Vehicle vehicle;
    ParkingType parkingType;
    int distance;
}

public class Vehicle
{
    int num;
}

public enum ParkingType
{
    REGULAR,
    HANDICAPPED,
    COMPACT,
    MAX_PARKING_TYPE,
}


답변

모델은 고립되어 존재하지 않습니다. 주차장에 진입하는 자동차의 시뮬레이션을 위해 정의한 구조, 여유 공간으로 안내하는 임베디드 시스템, 주차 요금 청구 시스템 또는 주차장에서 일반적으로 사용되는 자동 게이트 / 티켓 기계에 대해 모두 다릅니다.


답변

물체 지향 주차장에서는 자동차가 “주차 방법을 알고”있기 때문에 승무원이 필요하지 않습니다.

부지에서 사용할 수있는 차를 찾는 것은 어려울 것입니다. 가장 일반적인 모델은 모든 움직이는 부품이 공개 멤버 변수로 노출되거나 창문이나 문이없는 “완전히 캡슐화 된”자동차입니다.

OO 주차장의 주차 공간은 차량의 크기 및 모양과 일치하지 않습니다 (공간과 차량 간의 “조밀 불일치”).

부지의 라이센스 태그에는 각 문자와 숫자 사이에 점이 있습니다. 장애인 주차는 “_”로 시작하는 면허 만 이용 가능하며 “m_”로 시작하는 면허는 견인됩니다.


답변

“공간”유형의 다차원 배열 (생성자에 지정됨)을 보유하는 주차장이 필요합니다. 주차장은 공간을 채우고 비우는 함수에 대한 호출을 통해 얼마나 많은 공간을 차지했는지 추적 할 수 있으며 공간은 어떤 종류의 공간인지 알려주는 열거 형을 보유 할 수 있습니다. 공간에는 또한 taken () 메서드가 있습니다. 주차 대행을 위해 첫 번째로 열리는 공간을 찾아 차를 거기에 두십시오. 또한 장애인, 소형 또는 일반 차량인지 여부를 담을 수있는 공간에 넣을 Car 개체가 필요합니다.


class ParkingLot
{
    Space[][] spaces;

    ParkingLot(wide, long); // constructor

    FindOpenSpace(TypeOfCar); // find first open space where type matches
}

enum TypeOfSpace = {compact, handicapped, regular };
enum TypeOfCar = {compact, handicapped, regular };

class Space
{
    TypeOfSpace type;
    bool empty;
    // gets and sets here
    // make sure car type
}

class car
{
    TypeOfCar type;
}


답변