Skip to content

Instantly share code, notes, and snippets.

@Junee01
Last active August 20, 2016 00:43
Show Gist options
  • 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 20, 2016

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

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

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

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