주차 시스템을 설계한다고 가정해 봅시다. 이 주차장에는 대형(big), 중형(medium), 소형(small) 세 가지 종류의 주차 공간이 있으며, 각 크기별로 정해진 수의 주차 슬롯이 존재합니다.
이 문제는 두 개의 메서드를 가진 OurParkingSystem 클래스를 만드는 것입니다.
- 생성자 constructor(big, medium, small) — 각 크기별로 사용 가능한 주차 슬롯의 개수를 인자로 받아
OurParkingSystem객체를 초기화합니다. - addCar(carType) — 주차장에 들어오려는 차량에 대해 해당
carType의 주차 공간이 남아 있는지 확인합니다.
문제 조건 이해하기
세 가지 주차 공간인 대형, 중형, 소형은 각각 숫자 1, 2, 3으로 표현됩니다. 핵심 제약 조건은 차량이 자신의 carType과 일치하는 주차 공간에만 주차할 수 있다는 점입니다. 만약 빈 공간이 없다면 false를 반환하고, 공간이 있다면 해당 크기의 공간에 차량을 주차한 후 true를 반환합니다.
예를 들어 대형 주차 공간이 2개, 중형은 0개, 소형은 1개라면 생성자 호출은 OurParkingSystem(2, 0, 1)과 같습니다. 이때 addCar를 다음과 같이 호출해 보겠습니다.
- addCar(3) — 소형차 한 대를 주차하고 true 반환
- addCar(2) — 중형 주차 공간이 없으므로 false 반환
- addCar(3) — 새로운 소형차를 주차할 공간이 없으므로 false 반환
- addCar(1) — 대형차 한 대를 주차하고 true 반환
- addCar(1) — 대형차 한 대를 더 주차하고 true 반환
- addCar(1) — 대형 주차 공간이 모두 찼으므로 false 반환
해결 접근 방법
이 문제는 다음 단계를 따라 해결할 수 있습니다.
constructor()함수를 정의합니다. 이 함수는 big, medium, small 값을 인자로 받습니다.sp := [0, big, medium, small]형태의 리스트를 생성합니다. 인덱스를 carType 값(1~3)과 직접 맞추기 위해 첫 번째 요소를 0으로 채우는 것이 핵심입니다.addCar()함수를 정의합니다. 이 함수는 carType을 인자로 받습니다.- 만약
sp[carType] > 0이라면:sp[carType]값을 1 감소시킵니다.True를 반환합니다.
- 그렇지 않으면
False를 반환합니다.
Python 구현 예제
아래 구현 예제를 통해 더 잘 이해해 보겠습니다.
class OurParkingSystem:
def __init__(self, big, medium, small):
self.sp = [0, big, medium, small]
def addCar(self, carType):
if(self.sp[carType] > 0):
self.sp[carType] -= 1
return True
return False
ps = OurParkingSystem(2, 0, 1)
print(ps.addCar(3))
print(ps.addCar(2))
print(ps.addCar(3))
print(ps.addCar(1))
print(ps.addCar(1))
print(ps.addCar(1))입력
ps.addCar(3) ps.addCar(2) ps.addCar(3) ps.addCar(1) ps.addCar(1) ps.addCar(1)
출력
True False False True True False
코드 동작 원리 분석
이 구현의 핵심은 리스트 sp의 인덱스 설계에 있습니다. 리스트를 [0, big, medium, small]로 초기화하면 carType 값이 곧 리스트의 인덱스가 되므로, 별도의 조건 분기나 딕셔너리 없이 sp[carType]만으로 해당 타입의 잔여 슬롯에 바로 접근할 수 있습니다.
addCar 메서드는 O(1)의 시간 복잡도로 동작합니다. 해당 타입의 슬롯이 남아 있으면 개수를 하나 줄이고 True를 반환하며, 그렇지 않으면 False를 반환하는 매우 단순하고 효율적인 구조입니다. 이러한 패턴은 실무에서 재고 관리, 좌석 예약 시스템 등 유한한 자원의 상태를 추적하는 다양한 상황에 응용할 수 있습니다.