문제 지문 #10
미용실과 레스토랑이 예약을 받는 기준은 다음과 같습니다.
- 미용실
- 인원수가 1명인 경우에만 예약받습니다.
- 다른 손님과 예약 시간이 겹칠 수 없습니다.
- 레스토랑
- 인원수가 2명 이상 8명 이하인 경우에만 예약받습니다.
- 최대 두 팀까지 예약 시간이 겹칠 수 있습니다.
두 가게에서 예약을 받은 횟수를 계산하기 위해 다음과 같이 Customer, Shop, HairShop, Restaurant 클래스를 작성했습니다.
- Customer:
- Customer : 고객을 나타내는 클래스입니다.
- id : 고객 식별 번호를 나타냅니다.
- time : 고객이 신청한 예약 시간을 나타냅니다.
- numOfPeople : 예약 인원수를 나타냅니다.
- Shop :
- Shop : 가게를 나타내는 클래스입니다.
- reserveList : 가게에 예약한 고객 리스트입니다.
- reserve : 고객을 매개변수로 받아, 예약 고객 리스트에 추가 후 true를 return 합니다.
- HairShop :
- HairShop : 미용실을 나타내는 클래스이며, Shop을 상속합니다.
- reserve : 고객을 매개변수로 받아, 미용실의 예약 기준에 맞는지 검사합니다. 예약을 받았다면 예약 고객 리스트에 추가 후 true를 return 하고, 그렇지 않으면 false를 return 합니다.
- Restaurant :
- Restaurant는 레스토랑을 나타내는 클래스이며, Shop을 상속합니다.
- reserve : 고객을 매개변수로 받아, 레스토랑의 예약 기준에 맞는지 검사합니다. 예약을 받았다면 예약 고객 리스트에 추가 후 true를 return 하고, 그렇지 않으면 false를 return 합니다.
예약을 원하는 고객 정보가 담긴 배열 customers와 shops가 매개변수로 주어질 때, 두 가게에서 예약받은 횟수를 return 하도록 solution 메서드를 작성하려고 합니다. 위 클래스 구조를 참고하여 주어진 코드의 빈칸을 적절히 채워 전체 코드를 완성해주세요.
매개변수 설명
예약을 원하는 고객 정보가 담긴 배열 customers와 shops가 solution 메서드의 매개변수로 주어집니다.
- customers의 길이와 shops의 길이는 항상 같습니다.
- customers의 각 원소에는 고객 정보가 [고객 ID, 예약 시간, 예약 인원수] 순으로 들어있습니다.
- 고객 ID는 1 이상 10,000 이하인 자연수입니다.
- 예약 시간은 0 이상 23 이하인 정수입니다.
- 예약 인원수는 1 이상 10 이하인 자연수입니다.
- 고객 ID는 중복해서 주어지지 않습니다.
- customers에는 고객이 예약을 신청한 순서대로 들어있습니다.
- shops는 각 고객이 예약할 가게를 나타내며, "hairshop" 또는 "restaurant" 로만 구성되어 있습니다.
- i 번째 고객이 예약할 가게는 shops [i]입니다.
- 예약을 신청한 고객의 수는 1 이상 10 이하입니다.
return 값 설명
두 가게에서 예약받은 횟수를 return 해주세요.
예시
customers | shops | return |
[[1000, 2, 1], [2000, 2, 4], [1234, 5, 1], [4321, 2, 1], [1111, 3, 10]] | ["hairshop", "restaurant", "hairshop", "hairshop", "restaurant"] | 3 |
예시 설명
고객별 예약 정보는 다음과 같습니다.
ID | 예약 시간 | 인원수 | 가게 |
1000 | 2 | 1 | hairshop |
2000 | 2 | 4 | restaurant |
1234 | 5 | 1 | hairshop |
4321 | 2 | 1 | hairshop |
1111 | 3 | 10 | restaurant |
- 첫 번째 고객은 미용실에서 예약받습니다.
- 두 번째 고객은 레스토랑에서 예약받습니다.
- 세 번째 고객은 미용실에서 예약받습니다.
- 네 번째 고객은 예약받지 않습니다. 2시에 미용실을 먼저 예약한 손님이 있기 때문입니다.
- 다섯 번째 고객은 예약받지 않습니다. 레스토랑에 한 번에 예약 가능한 인원수는 2명 이상 8명 이하입니다.
혼자 풀이
빈칸 채우기 문제입니다.
여기서는 Iterator를 이용해서 ArrayList인 reserveList를 순회하면서 동일 시간대 예약 손님이 있는지를 찾습니다.
Iterator를 강의 중 들은 기억은 있는데, 어떻게 쓰는지 기억이 잘 안 났습니다.
next 나오는 거 보니 리스트 순회하는 개념이구나 정도로 이해하고, 문제에 주어진 대로 값을 비교하는 부분만 작성했습니다.
코드에 대한 설명은 아래에 주석으로 달았습니다.
import java.util.ArrayList;
import java.util.Iterator;
//Shop 인터페이스와 HairShop, Restaurant 클래스는 Inner Class로 작성되어있습니다. 아래 코드를 잘 읽고 빈칸을 채워주세요.
class MySolution {
class Shop{
protected ArrayList<Customer> reserveList;
public Shop() {
this.reserveList = new ArrayList<Customer>();
}
public boolean reserve(Customer customer){
reserveList.add(customer);
return true;
}
}
class Customer{
public int id;
public int time;
public int numOfPeople;
public Customer(int id, int time, int numOfPeople){
this.id = id;
this.time = time;
this.numOfPeople = numOfPeople;
}
}
// class HairShop @@@ {
//Shop 인터페이스라고 되어있는데, implements를 하면 안되고 extends를 해야함
class HairShop extends Shop {
public HairShop(){
super();
}
// @@@{
public boolean reserve(Customer customer){
// if(@@@ != 1)
if(customer.numOfPeople != 1) //인원수가 1이 아니면 예약받지 않음
return false;
Iterator<Customer> iter = reserveList.iterator();
while (iter.hasNext()) { //iterator를 사용하여 reserveList를 순회
Customer r = iter.next();
// if(@@@)
if(r.time==customer.time) //예약시간이 겹치면 예약받지 않음
return false;
}
reserveList.add(customer); //예약 불가능 조건에 해당하지 않으면 예약리스트에 추가
return true;
}
}
// class Restaurant @@@ {
class Restaurant extends Shop {
public Restaurant(){
super();
}
// @@@{
// if(@@@)
public boolean reserve(Customer customer){
if(customer.numOfPeople < 2 | customer.numOfPeople > 8) //2명이상 8명이하만 예약가능
return false;
int count = 0;
Iterator<Customer> iter = reserveList.iterator();
while (iter.hasNext()) { //iterator를 사용하여 reserveList를 순회
Customer r = iter.next();
// if(@@@)
if(r.time==customer.time) //예약시간이 같으면 count를 증가시키고
count += 1;
}
if(count >= 2) //count가 2이상이면 예약이 불가능
return false;
reserveList.add(customer); //예약 불가능 조건에 해당하지 않으면 예약리스트에 추가
return true;
}
}
public int solution(int[][] customers, String[] shops) {
Shop hairshop = new HairShop();
Shop restaurant = new Restaurant();
int count = 0;
for(int i = 0; i < shops.length; i++){
if(shops[i].equals("hairshop")){
if(hairshop.reserve(new Customer(customers[i][0], customers[i][1], customers[i][2])))
count += 1;
}
else if(shops[i].equals("restaurant")){
if(restaurant.reserve(new Customer(customers[i][0], customers[i][1], customers[i][2])))
count += 1;
}
}
return count;
}
// 아래는 테스트케이스 출력을 해보기 위한 main 메소드입니다.
public static void main(String[] args) {
MySolution sol = new MySolution();
int[][] customers = {{1000, 2, 1},{2000, 2, 4},{1234, 5, 1},{4321, 2, 1}, {1111, 3, 10}};
String[] shops = {"hairshop", "restaurant", "hairshop", "hairshop", "restaurant"};
int ret = sol.solution(customers, shops);
// [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
System.out.println("solution 메소드의 반환 값은 " + ret + " 입니다.");
}
}
정답
혼자 풀이와 동일합니다.
첨부 파일
프로젝트 파일 전체를 첨부합니다.
Solution 이 문제, CorrectSolution 이 정답, MySolution이 제가 푼 것입니다.
"Project from existing sources..." 메뉴에서 불러다 쓰시면 됩니다.
'Programming > Cos Pro 1급' 카테고리의 다른 글
Cos Pro 1급 - 샘플 문제 풀이 4차 1번 (재귀함수 활용) (1) | 2022.10.27 |
---|---|
Cos Pro 1급 공부 사이트 추천 - 구름에듀(https://edu.goorm.io/) (2) | 2022.10.25 |
Cos Pro 1급 - 샘플 문제 풀이 3차 9번 (숫자 배열의 구간별 합계) (1) | 2022.10.21 |
Cos Pro 1급 - 샘플 문제 풀이 3차 8번 (continue와 break) (2) | 2022.10.20 |
Cos Pro 1급 - 샘플 문제 풀이 3차 7번 (자리수 별 연산 방법) (1) | 2022.10.20 |
댓글