import java.util.*;
class Car {
public static final boolean HANDICAPPED = true;
private String number;
private boolean handicapped;
public Car(String number) {
setNumber(number);
}
public Car(String number, boolean handicapped) {
setHandicapped(handicapped);
setNumber(number);
}
@Override
public String toString() {
String kind = handicapped ? "장애인차량" : "일반차량";
return number + "(" + kind + ")";
}
@Override
public boolean equals(Object o) {
if(o == null || !(o instanceof Car)) {
return false;
}
Car temp = (Car)o;
return number.equals(temp.getNumber());
}
public void setNumber(String number) {
this.number = number;
}
public void setHandicapped(boolean handicapped) {
this.handicapped = handicapped;
}
public String getNumber() {
return number;
}
public boolean isHandicapped() {
return handicapped;
}
}
class ParkingArea {
private static int no = 1;
private int areaNo;
private Car car;
private boolean kind;
public ParkingArea(boolean kind) {
setKind(kind);
areaNo = no;
no++;
}
public boolean isEmpty() {
return car == null;
}
public Car out() {
Car temp = car;
car = null;
return temp;
}
public boolean in(Car car) {
if(!isEmpty()) {
return false;
}
if(car.isHandicapped()) {
this.car = car;
return true;
}
if(kind) {
System.out.println("비장애인은 장애인 주차구역에 주차할 수 없습니다.");
return false;
}
this.car = car;
return true;
}
@Override
public boolean equals(Object o) {
if(o == null || !(o instanceof ParkingArea)) {
return false;
}
ParkingArea temp = (ParkingArea) o;
return areaNo == temp.getAreaNo();
}
@Override
public String toString() {
String info = areaNo + "번";
info += "주차구역(장애인전용: " + kind + ") - ";
if(car == null) {
info += "비어있음";
} else {
info += car + "주차 중";
}
return info;
}
public static void setNo(int no) {
ParkingArea.no = no;
}
public void setAreaNo(int areaNo) {
this.areaNo = areaNo;
}
public void setCar(Car car) {
this.car = car;
}
public void setKind(boolean kind) {
this.kind = kind;
}
public static int getNo() {
return no;
}
public int getAreaNo() {
return areaNo;
}
public Car getCar() {
return car;
}
public boolean isKind() {
return kind;
}
}
class ParkingInfo implements Comparable<ParkingInfo> {
private String number;
private int areaNo;
public ParkingInfo(String number) {
setNumber(number);
}
public ParkingInfo(String number, int areaNo) {
setNumber(number);
setAreaNo(areaNo);
}
@Override
public int compareTo(ParkingInfo info) {
return number.compareTo(info.getNumber());
}
public String tostring() {
return areaNo + "(" + number + ")";
}
public void setNumber(String number) {
this.number = number;
}
public void setAreaNo(int areaNo) {
this.areaNo = areaNo;
}
public String getNumber() {
return number;
}
public int getAreaNo() {
return areaNo;
}
}
class ParkingLot {
public static final int OUT_OF_RANGE = -1;
public static final int MAX_TRY = 5;
public ArrayList<ParkingInfo> info;
private ParkingArea[] units;
private int currentCount;
private final int MAX_COUNT;
private Random random;
public ParkingLot(int max, int countOfHandicapped) {
if(countOfHandicapped > max) {
System.out.println("최대 주차수보다 장애인 전용 주차수가 더 많을 수 없습니다.");
System.out.println(OUT_OF_RANGE);
}
MAX_COUNT = max;
units = new ParkingArea[MAX_COUNT];
for(int i = 0; i < MAX_COUNT; i++) {
boolean isHandicapped = false;
if(i < countOfHandicapped) {
isHandicapped = Car.HANDICAPPED;
}
units[i] = new ParkingArea(isHandicapped);
}
info = new ArrayList<ParkingInfo>();
random = new Random();
}
public boolean in(Car car) {
System.out.println(car + "주차시도 중 ...");
if (currentCount < MAX_COUNT) {
int tryCount = 0;
int idx;
boolean isOk;
do {
idx = random.nextInt(MAX_COUNT);
tryCount++;
isOk = units[idx].in(car);
} while (!isOk && tryCount < MAX_TRY);
if (isOk) {
ParkingInfo temp = new ParkingInfo(
car.getNumber(), idx + 1
);
info.add(temp);
currentCount++;
System.out.println(
"주차완료(" + car.getNumber() + " / " + temp.getAreaNo() + "번구역) : 남은자리(" + (MAX_COUNT - currentCount) + "개)"
);
return true;
} else {
System.out.println("주차자리를 못찾고 떠나갑니다(" + car + ")");
return false;
}
} else {
System.out.println("죄송합니다. 만차입니다.");
return false;
}
}
public Car out(String number) {
Car car = null;
Collections.sort(info);
int idx = Collections.binarySearch(
info, new ParkingInfo(number)
);
if(idx >= 0) {
ParkingInfo temp = info.get(idx);
car = units[temp.getAreaNo() - 1].out();
info.remove(temp);
currentCount--;
System.out.println("출차완료(" + number + ")");
} else {
System.out.println("해당차량이 존재하지 않습니다. (" + number + ")");
};
return car;
}
@Override
public String toString() {
String info = "<< 주차정보 >>\n";
for(ParkingArea temp : units) {
info += temp + "\n";
}
info += "주차 가능 차량 수 : " + (MAX_COUNT - currentCount);
return info;
}
}
public class TestParkingLot {
public static void main(String[] args) {
ParkingLot lot = new ParkingLot(9, 2);
Car[] cars = {
new Car("3가 7234", Car.HANDICAPPED),
new Car("2가 7234", Car.HANDICAPPED),
new Car("7가 9234"),
new Car("4가 8234"),
new Car("8가 9234"),
new Car("6가 9234"),
new Car("5가 9234"),
new Car("9가 9234"),
new Car("1가 1233", Car.HANDICAPPED),
new Car("2가 6234", Car.HANDICAPPED)
};
for(Car temp : cars) {
lot.in(temp);
}
lot.out("5가 9234");
System.out.println(lot);
lot.out("9가 9234");
System.out.println(lot);
lot.out("7가 9234");
System.out.println(lot);
}
}
3가 7234(장애인차량)주차시도 중 ...
주차완료(3가 7234 / 9번구역) : 남은자리(8개)
2가 7234(장애인차량)주차시도 중 ...
주차완료(2가 7234 / 4번구역) : 남은자리(7개)
7가 9234(일반차량)주차시도 중 ...
주차완료(7가 9234 / 6번구역) : 남은자리(6개)
4가 8234(일반차량)주차시도 중 ...
주차완료(4가 8234 / 8번구역) : 남은자리(5개)
8가 9234(일반차량)주차시도 중 ...
비장애인은 장애인구역에 주차할 수 없습니다.
주차완료(8가 9234 / 3번구역) : 남은자리(4개)
6가 9234(일반차량)주차시도 중 ...
비장애인은 장애인구역에 주차할 수 없습니다.
주차완료(6가 9234 / 5번구역) : 남은자리(3개)
5가 9234(일반차량)주차시도 중 ...
비장애인은 장애인구역에 주차할 수 없습니다.
비장애인은 장애인구역에 주차할 수 없습니다.
비장애인은 장애인구역에 주차할 수 없습니다.
주차자리를 못찾고 떠나갑니다(5가 9234(일반차량))
9가 9234(일반차량)주차시도 중 ...
주차완료(9가 9234 / 7번구역) : 남은자리(2개)
1가 1233(장애인차량)주차시도 중 ...
주차완료(1가 1233 / 1번구역) : 남은자리(1개)
2가 6234(장애인차량)주차시도 중 ...
주차완료(2가 6234 / 2번구역) : 남은자리(0개)
해당차량이 존재하지 않습니다. (5가 9234)
<< 주차정보 >>
1번주차구역(장애인전용: true) - 1가 1233(장애인차량)주차 중
2번주차구역(장애인전용: true) - 2가 6234(장애인차량)주차 중
3번주차구역(장애인전용: false) - 8가 9234(일반차량)주차 중
4번주차구역(장애인전용: false) - 2가 7234(장애인차량)주차 중
5번주차구역(장애인전용: false) - 6가 9234(일반차량)주차 중
6번주차구역(장애인전용: false) - 7가 9234(일반차량)주차 중
7번주차구역(장애인전용: false) - 9가 9234(일반차량)주차 중
8번주차구역(장애인전용: false) - 4가 8234(일반차량)주차 중
9번주차구역(장애인전용: false) - 3가 7234(장애인차량)주차 중
주차 가능 차량 수 : 0
출차완료(9가 9234)
<< 주차정보 >>
1번주차구역(장애인전용: true) - 1가 1233(장애인차량)주차 중
2번주차구역(장애인전용: true) - 2가 6234(장애인차량)주차 중
3번주차구역(장애인전용: false) - 8가 9234(일반차량)주차 중
4번주차구역(장애인전용: false) - 2가 7234(장애인차량)주차 중
5번주차구역(장애인전용: false) - 6가 9234(일반차량)주차 중
6번주차구역(장애인전용: false) - 7가 9234(일반차량)주차 중
7번주차구역(장애인전용: false) - 비어있음
8번주차구역(장애인전용: false) - 4가 8234(일반차량)주차 중
9번주차구역(장애인전용: false) - 3가 7234(장애인차량)주차 중
주차 가능 차량 수 : 1
출차완료(7가 9234)
<< 주차정보 >>
1번주차구역(장애인전용: true) - 1가 1233(장애인차량)주차 중
2번주차구역(장애인전용: true) - 2가 6234(장애인차량)주차 중
3번주차구역(장애인전용: false) - 8가 9234(일반차량)주차 중
4번주차구역(장애인전용: false) - 2가 7234(장애인차량)주차 중
5번주차구역(장애인전용: false) - 6가 9234(일반차량)주차 중
6번주차구역(장애인전용: false) - 비어있음
7번주차구역(장애인전용: false) - 비어있음
8번주차구역(장애인전용: false) - 4가 8234(일반차량)주차 중
9번주차구역(장애인전용: false) - 3가 7234(장애인차량)주차 중
주차 가능 차량 수 : 2