Theater.java
- 행과 열을 인수로 받아 이중 Seat 배열을 가진다.
- 좌석을 예약하거나 취소한다
- 예약된 좌석을 보여준다.
public class Theater {
private Seat[][] seats;
private int rowCount, colCount;
// Theater 생성자 : 행, 열 인수.
public Theater(int rowCount, int colCount) {
// 행은 알파벳의 26자리를 넘어가지 못한다.
if (rowCount > 26) {
rowCount = 26; // number of alphabets
}
// 영화관의 시트 이중 배열을 생성한다.
seats = new Seat[rowCount][colCount];
// 해당 시트자리마다 시트객체를 생성한다.
for (int i = 0; i < rowCount; i++) {
for (int j = 0; j < colCount; j++) {
seats[i][j] = new Seat();
}
}
this.rowCount = rowCount;
this.colCount = colCount;
}
// 시트 예약 메소드 : 이름, 행, 열, 열부터 오름차순으로 가는 자리 갯수
public boolean reserve(String name, char rowChar, int col, int numSeat) {
// 행, 열의 수가 맞지 않으면 예약 실패
if ((col < 0 || col > colCount) || (getRowIndex(rowChar) < 0 || getRowIndex(rowChar) > rowCount)) {
return false;
// 예약한 좌석이 하나라도 이미 예약이 되어있다면 예약 실패
} else {
for (int i = 0; i < numSeat; i++) {
// 예약 좌석수가 많아 좌석이 존재하지 않을 경우 예외처리
try {
if (seats[getRowIndex(rowChar)][col + i - 1].isOccupied()) {
return false;
}
} catch (ArrayIndexOutOfBoundsException e) {
return false;
}
}
// 예약좌석수 만큼 예약.
for (int i = 0; i < numSeat; i++) {
seats[getRowIndex(rowChar)][col + i - 1].reserve(name);
}
return true;
}
}
// 해당 이름으로 예약한 좌석을 취소 하고 예약 취소된 좌석수를 반환
public int cancel(String name) {
int cancelCount = 0;
Seat s;
// 예약한 좌석이 이미 예약이 되어있고 해당이름으로 된 것이 맞다면
for (int i = 0; i < rowCount; i++) {
for (int j = 0; j < colCount; j++) {
s = seats[i][j];
if ((s.isOccupied()) && (s.match(name))) {
// 예약취소
s.cancel();
cancelCount++;
}
}
}
return cancelCount;
}
// 행, 열, 좌석수를 주어주고 해당 좌석만큼 예약한 것을 취소하고 취소된 좌석수를 반환
public int cancel(char rowChar, int col, int numSeat) {
// 여기에 코드를 작성하세요
int cancelCount = 0;
Seat s;
for (int j = 0; j < numSeat; j++) {
// 해당 행, 열에서 좌석 수만큼 예약이 되었는지 확인하고 예약취소
s = seats[getRowIndex(rowChar)][col + j - 1];
if (s.isOccupied()) {
s.cancel();
cancelCount++;
}
}
return cancelCount;
}
// 영화관 전체에서 예약된 좌석수 반환
public int getNumberOfReservedSeat() {
int reverseCount = 0;
Seat s;
for (int i = 0; i < rowCount; i++) {
for (int j = 0; j < colCount; j++) {
s = seats[i][j];
if (s.isOccupied()) {
reverseCount++;
}
}
}
return reverseCount;
// 여기에 코드를 작성하세요
}
// 영화관에서 예약된 화면을 출력하는 메소드
public void printSeatMatrix() {
// 열 출력
System.out.print(" ");
for (int i = 1; i <= 9; i++) {
System.out.print(" " + i);
}
System.out.println();
// 행 출력
for (int i = 0; i < rowCount; i++) {
System.out.print((char) ('A' + i) + ": ");
for (int j = 0; j < colCount; j++) {
Seat s = seats[i][j];
// 해당좌석이 예약이 되었는지 보여주기
if (s.isOccupied()) {
System.out.print("[O]");
} else {
System.out.print("[ ]");
}
}
System.out.println();
}
}
// 대문자 알파벳을 asci code를 이용해서 행의 숫자를 반환
private int getRowIndex(char uppercaseChar) {
return uppercaseChar - 'A';
}
}
Seat.java
- Seat 클래스 이다.
- 좌석을 예약한 사람의 이름으로 좌석을 채운다.
- 예약을 취소하여 빈자리를 만들거나 예약하거나, 예약의 여부를 이름으로 확인가능하고,
빈좌석인지 아닌지 확인한다.
public class Seat {
private String name;
// seat의 예약자 이름 getter
public String getName() {
return name;
}
// seat의 예약자 이름으로 예약하는 메소드
public void reserve(String name) {
this.name = name;
}
// seat의 예약을 취소함
public void cancel() {
name = null;
}
// 해당 seat가 예약이 되었으면 true 아니면 false
public boolean isOccupied() {
return name != null;
}
// 해당 시트가 checkName으로 예약이 되었나 확인하는 메소드
public boolean match(String checkName) {
return name.equals(checkName);
}
}
public class Main {
public static void main(String[] args) {
// Theater 생성
Theater t = new Theater(5, 9);
// 좌석 예약
System.out.println("김신의님 이름으로 A5부터 2개의 좌석 예약: " + (t.reserve("김신의", 'A', 5, 2) ? "성공" : "실패"));
System.out.println("이윤수님 이름으로 C1부터 3개의 좌석 예약: " + (t.reserve("이윤수", 'C', 1, 3) ? "성공" : "실패"));
System.out.println("강영훈님 이름으로 D4부터 7개의 좌석 예약: " + (t.reserve("강영훈", 'D', 4, 7) ? "성공" : "실패"));
System.out.println("문종모님 이름으로 C7부터 3개의 좌석 예약: " + (t.reserve("문종모", 'C', 7, 3) ? "성공" : "실패"));
// 좌석 취소
System.out.println("A6부터 좌석 3개 취소: 총 " + t.cancel('A', 6, 3) + "개의 좌석이 취소되었습니다.");
System.out.println("이윤수님의 좌석 취소: 총 " + t.cancel("이윤수") + "개의 좌석이 취소되었습니다.");
// 결과 출력
System.out.println();
t.printSeatMatrix();
System.out.println("총 " + t.getNumberOfReservedSeat() + "개의 좌석이 예약되었습니다.");
}
}
김신의님 이름으로 A5부터 2개의 좌석 예약: 성공
이윤수님 이름으로 C1부터 3개의 좌석 예약: 성공
강영훈님 이름으로 D4부터 7개의 좌석 예약: 실패
문종모님 이름으로 C7부터 3개의 좌석 예약: 성공
A6부터 좌석 3개 취소: 총 1개의 좌석이 취소되었습니다.
이윤수님의 좌석 취소: 총 3개의 좌석이 취소되었습니다.
'Programming language > Java' 카테고리의 다른 글
Java - 실무5 [MP3플레이어] (1) | 2020.10.18 |
---|---|
Java - 실무4 [학점계산기] (2) | 2020.10.18 |
Java - 실무2 [포켓몬 도감] (2) | 2020.10.18 |
Java - 실무1 [은행] (2) | 2020.10.18 |
Java - 8 [Wrapper Class, ArrayList, HashMap] (2) | 2020.10.17 |