Skip to content

Instantly share code, notes, and snippets.

@Junee01
Last active August 20, 2016 00:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Junee01/dfbd6bf9de3a58f6fe75f7eb9a24da2b to your computer and use it in GitHub Desktop.
Save Junee01/dfbd6bf9de3a58f6fe75f7eb9a24da2b to your computer and use it in GitHub Desktop.
Design ParkingLot to code with Ruby
#Car 클래스는 주차하러온 차를 의미합니다.
class Car
attr_reader :plateNumber
#차량 등록 번호를 초기화합니다. 차량 번호는 우선 String 형태로 되어 있다고 가정합니다.
def initialize plateNumber
@plateNumber = plateNumber #차량 등록번호
end
end
#Lot 클래스는 각 주차공간을 의미합니다.
class Lot
attr_reader :spaceNumber, :available, :parkedCarNumber
#주차 공간 하나하나에 대한 초기화입니다.
def initialize spaceNumber
@spaceNumber = spaceNumber #주차 공간의 번호
@available = true #비어있는지 여부
@parkedCarNumber = "" #주차된 차량의 번호
end
#parkinglot 부분에서 사용가능한 공간이 있는지, 주차된 차와 일치하는 것이 있는지를 확인하여 걸러내므로 여기서는 주차와 반환만 담당합니다.
#공간이 있다면 차를 주차를 완료합니다.
def park car
@available = false
@parkedCarNumber = car.plateNumber
print car.plateNumber.to_s + "차량을" + self.spaceNumber.to_s + "에 주차했습니다.\n"
end
#요청한 번호화 주차된 차 번호를 비교하고 번호가 일치한다면 차를 뺍니다.
def pull plateNumber
print @parkedCarNumber + "차량을 성공적으로 차를 뺐습니다.\n"
@available = true
@parkedCarNumber = ""
end
end
#Parkinglot Class는 주차장을 의미합니다.
class ParkingLot
attr_reader :lots
#주차장을 초기화합니다. 'capacity'개의 Lots를 생성합니다.
def initialize capacity
@lots = capacity.times.map { |i| Lot.new(i) }
print capacity.to_s + "개의 공간을 가진 주차장이 만들어졌습니다.\n"
end
#주차 요청을 할 때 사용하는 메소드입니다.
def storeCar car
spaceAvailable = getAvailableSpace
if spaceAvailable != false
spaceAvailable.park(car)
else
print "공간이 부족하여 주차할 수 없습니다.\n"
return false
end
end
#차 반환 요청을 할 때 사용하는 메소드입니다.
def getCar plateNumber
spaceOfCar = findCar(plateNumber)
if spaceOfCar != false
spaceOfCar.pull(plateNumber)
else
return false
end
end
#주차장에 사용가능한 공간이 있는지를 확인하는 메소드입니다.
#사용가능한 공간을 반환하고 검색을 종료합니다.
def getAvailableSpace
@lots.each do |lot|
if lot.available == true
return lot
end
end
return false
end
#주차되어있는 차 중 해당 번호의 차가 주차되어 있는지 확인하는 메소드입니다.
#존재한다면 해당 차량의 공간을 반환하고 검색을 종료합니다.
def findCar plateNumber
@lots.each do |lot|
if lot.parkedCarNumber == plateNumber
return lot
end
end
print "그러한 번호의 차량은 없습니다.\n"
return false
end
end
#주차 공간은 처음 이후로 변화하지 않습니다. 늘 사용가능한 상태라고 가정합니다.
#주차 공간의 크기는 어떠한 차라도 들어갈 수 있을 정도로 한 공간이 여유롭습니다. 때문에 차의 종류나 크기는 처리하지 않습니다.
#주차 가격 및 이용시간은 무료/무제한입니다. 하지만 먼저 선점한 사람이 주인이 됩니다. 차를 빼는 순간 권한이 사라집니다.
#예외처리는 모두 return fasle로 해놓았습니다.
#주차 공간은 0부터 순서대로 가까운 곳에 있다고 가정하고, 가장 가까운 곳부터 차례차례 채워 넣는다고 가정합니다.
require_relative('../ChattingCat_Assignment/car')
require_relative('../ChattingCat_Assignment/lot')
require_relative('../ChattingCat_Assignment/parkinglot')
ChattingCatPark = ParkingLot.new(5) #주차 공간을 하나 만들겠습니다. 주차 공간은 5개가 있습니다.
Cars = Array.new
10.times do |i|
Cars << Car.new("Car " + i.to_s) #자동차를 "Car 0" ~ "Car 9"라는 이름으로 생성합니다.
end
print "10개의 차가 만들어졌습니다.\n"
#10개의 자동차를 5개의 공간에 차례차례 주차해보겠습니다.
#예상대로라면, 앞의 5개는 성공 뒤의 5개는 실패입니다.
Cars.each do |car|
ChattingCatPark.storeCar(car)
end
#차 Car 0, Car 3에 해당하는 차를 빼겠습니다.
#또한 Car 000라는 걸 빼보겠습니다. 이런 차는 주차되어 있지 않기때문에 실패입니다.
ChattingCatPark.getCar("Car 0")
ChattingCatPark.getCar("Car 3")
#주차 공간이 2개가 나왔기 때문에 다음 중 2개가 성공합니다.
ChattingCatPark.storeCar(Cars[5]) #각각 0
ChattingCatPark.storeCar(Cars[6]) #3이 주차되어있던 공간에 주차됩니다.
ChattingCatPark.getCar("Car 000") #해당 차 번호가 없기 때문에 없다고 합니다.
@Junee01
Copy link
Author

Junee01 commented Aug 19, 2016

참고로 테스트는 돌려보면 다음과 같은 결과화면이 나옵니다.

5개의 공간을 가진 주차장이 만들어졌습니다.
10개의 차가 만들어졌습니다.
Car 0차량을0에 주차했습니다.
Car 1차량을1에 주차했습니다.
Car 2차량을2에 주차했습니다.
Car 3차량을3에 주차했습니다.
Car 4차량을4에 주차했습니다.
공간이 부족하여 주차할 수 없습니다.
공간이 부족하여 주차할 수 없습니다.
공간이 부족하여 주차할 수 없습니다.
공간이 부족하여 주차할 수 없습니다.
공간이 부족하여 주차할 수 없습니다.
Car 0차량을 성공적으로 차를 뺐습니다.
Car 3차량을 성공적으로 차를 뺐습니다.
Car 5차량을0에 주차했습니다.
Car 6차량을3에 주차했습니다.
그러한 번호의 차량은 없습니다.

@Junee01
Copy link
Author

Junee01 commented Aug 20, 2016

우선 귀한 시간내주셔서 감사합니다. 에이프릴님. 케빈님. 면접은 참 재미있었습니다.
어제 기한내로 끝내겠다고 했고, 그 날 마무리를 짓고 집에 갔습니다. 그런데 케빈님이 생각하시는 만큼의 주차장인지는 잘 모르겠습니다.
패턴, 리팩토링 그리고 루비의 특정 메소드를 사용하면 코드 수를 줄이고 구현이 가능하다고 생각했습니다.

하지만 우선은 위의 코드가 제가 생각하는 최소한의 주차장입니다. 상황에 따라 사용자, 요금 등이 추가 될 수 있지만 우선은 제외하고 주차와 차 빼기에 초점을 두고 구현하였습니다.

'내 것으로 만들 수 있는 사람' 이라는 말에 공감을 많이 했습니다. 지금까지는 빨리 결과물을 만들어서 포트폴리오에 올리고 다른 걸 만드는 데에 초점을 두었는데, 레일즈 튜토리얼도 아직 100% 이해하지 못하고 작업을 해서그런지 기초적인 질문에 만족스럽게 대답하지 못했던 것 같습니다. 루비 기초 문법부터 다시 시작하면서 생각을 바로 구현할 수 있도록 연습 해야겠습니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment